例如,我想获取应用了某些标签的所有项目的列表。我可以执行以下任一操作:
SELECT Item.ID, Item.Name
FROM Item
WHERE Item.ID IN (
SELECT ItemTag.ItemID
FROM ItemTag
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)
Or
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
或者完全不同的东西。
一般来说(假设有一般规则),什么是更有效的方法?
SELECT Item.ID, Item.Name
FROM Item
WHERE Item.ID IN (
SELECT ItemTag.ItemID
FROM ItemTag
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)
or
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
没有对其进行分组或聚合。
如果我们删除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
is a UNIQUE
键并标记为这样。
SQL Server
能够检测到IN
条件为UNIQUE
列,并且只会改变IN
条件变为JOIN
.
If ItemTag.ItemID
is not 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
or EXISTS
.
有关更详细的性能比较,请参阅我的博客中的这篇文章:
- IN vs. JOIN vs. EXISTS http://explainextended.com/2009/06/16/in-vs-join-vs-exists/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)