久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP

SQL Efficiency: WHERE IN Subquery vs. JOIN then GROUP(SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP)
本文介紹了SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

例如,我想獲取應用了特定標簽的所有項目的列表.我可以執行以下任一操作:

As an example, I want to get the list of all items with certain tags applied to them. I could do either of the following:

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

或者完全不同的東西.

總的來說(假設有一個通用規則),什么是更有效的方法?

In general (assuming there is a general rule), what's a more efficient approach?

推薦答案

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 而沒有對其進行分組或聚合.

Your second query won't compile, since it references Item.Name without either grouping or aggregating on it.

如果我們從查詢中刪除 GROUP BY:

If we remove GROUP BY from the query:

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 鍵并被標記為這樣.

these are still different queries, unless ItemTag.ItemId is a UNIQUE key and marked as such.

SQL Server 能夠檢測 UNIQUE 列上的 IN 條件,并且只會轉換 IN> 條件轉換為 JOIN.

SQL Server is able to detect an IN condition on a UNIQUE column, and will just transform the IN condition into a JOIN.

如果ItemTag.ItemID不是UNIQUE,第一個查詢會使用一種SEMI JOIN算法,這種算法在SQL Server.

If ItemTag.ItemID is not UNIQUE, the first query will use a kind of a SEMI JOIN algorithm, which are quite efficient in SQL Server.

您可以將第二個查詢轉換為 JOIN:

You can trasform the second query into a 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

但是這個比 INEXISTS 效率低一點.

but this one is a trifle less efficient than IN or EXISTS.

有關更詳細的性能比較,請參閱我博客中的這篇文章:

See this article in my blog for a more detailed performance comparison:

  • IN vs. JOIN vs. EXISTS
  • IN vs. JOIN vs. EXISTS

這篇關于SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL trigger on Truncate(截斷時的 SQL 觸發器)
sql search query with multiple optional search parameters(具有多個可選搜索參數的 sql 搜索查詢)
Retrieving XML element name using t-SQL(使用 t-SQL 檢索 XML 元素名稱)
Insert double quotes into SQL output(在 SQL 輸出中插入雙引號)
Delete rows from CTE in SQL SERVER(從 SQL SERVER 中的 CTE 中刪除行)
TSQL to return NO or YES instead TRUE or FALSE(TSQL 返回 NO 或 YES 而不是 TRUE 或 FALSE)
主站蜘蛛池模板: 草在线| 国产综合精品一区二区三区 | 精品国产乱码久久久久久闺蜜 | 欧美一区二区三区精品 | dy天堂 | 逼逼网 | 男女性毛片 | 日本精品一区二区三区在线观看视频 | 日本三级电影免费观看 | 免费看片国产 | 91视频一区二区 | 狠狠av | 日韩一区二区三区视频在线播放 | 岛国午夜 | 亚洲美女视频 | 国产女人精品视频 | 亚洲国产成人av好男人在线观看 | 色爱区综合 | 国产精品一区二区三级 | 国产视频一区在线 | 午夜性色a√在线视频观看9 | 成人精品免费视频 | 久久成人国产精品 | 色在线免费视频 | 蜜桃色网| 国产精品视频网址 | 中文字幕在线播放第一页 | 欧美精品乱码久久久久久按摩 | 一区二区日韩 | 精精精精xxxx免费视频 | 成人午夜黄色 | 久久精品成人 | 欧美伊人久久久久久久久影院 | 自拍偷拍中文字幕 | 久久久久久久久久久福利观看 | 一级视频黄色 | 精品久草 | 国产精品一区二区欧美黑人喷潮水 | 亚洲一区久久 | 亚洲444kkkk在线观看最新 | 日韩免费福利视频 |