加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL效率:WHERE IN子查询与JOIN然后GROUP

发布时间:2020-12-12 16:12:30 所属栏目:MsSql教程 来源:网络整理
导读:例如,我想要获取应用了某些标签的所有项目的列表.我可以执行以下任一操作: SELECT Item.ID,Item.NameFROM ItemWHERE Item.ID IN ( SELECT ItemTag.ItemID FROM ItemTag WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55) 要么 SELECT Item.ID,Item.NameFROM
例如,我想要获取应用了某些标签的所有项目的列表.我可以执行以下任一操作:
SELECT Item.ID,Item.Name
FROM Item
WHERE Item.ID IN (
    SELECT ItemTag.ItemID
    FROM ItemTag
    WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)

要么

SELECT Item.ID,Item.Name
FROM Item
LEFT JOIN ItemTag ON ItemTag.ItemID = Item.ID
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55
GROUP BY Item.ID,Item.Name

或者完全不一样的东西

一般来说(假设有一般规则),什么是更有效的方法?

解决方法

06000

or

06001

您的第二个查询将无法编译,因为它引用了Item.Name,而不对其进行分组或聚合.

如果我们从查询中删除GROUP BY:

SELECT  Item.ID,Item.Name
FROM    Item
JOIN    ItemTag
ON      ItemTag.ItemID = Item.ID
WHERE   ItemTag.TagID = 57 OR ItemTag.TagID = 55

,这些仍然是不同的查询,除非ItemTag.ItemId是一个UNIQUE键并标记为这样.

SQL Server能够在UNIQUE列中检测IN条件,并将IN条件转换为JOIN.

在ItemTag.ItemID不是UNIQUE中,第一个查询将使用一种SEMI JOIN算法,这在SQL Server中非常有效.

您可以将第二个查询转换为JOIN:

SELECT  Item.ID,Item.Name
FROM    Item
JOIN    (
        SELECT DISTINCT ItemID
        FROMT  ItemTag
        WHERE  ItemTag.TagID = 57 OR ItemTag.TagID = 55
        ) tags
ON      tags.ItemID = Item.ID

,但是这个比IN或EXISTS的效率更低.

在我的博客中看到这篇文章更详细的性能比较:

> IN vs. JOIN vs. EXISTS

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读