例如,我想要获取应用了某些标签的所有项目的列表.我可以执行以下任一操作:
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,而不对其进行分组或聚合.
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的效率更低.