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

前端之家收集整理的这篇文章主要介绍了sql-server – SQL效率:WHERE IN子查询与JOIN然后GROUP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,我想要获取应用了某些标签的所有项目的列表.我可以执行以下任一操作:
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

猜你在找的MsSQL相关文章