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 或者完全不一样的东西 一般来说(假设有一般规则),什么是更有效的方法? 解决方法
您的第二个查询将无法编译,因为它引用了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的效率更低. 在我的博客中看到这篇文章更详细的性能比较: > (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |