久久久久久久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)
主站蜘蛛池模板: 中文字幕一区二区三区四区五区 | 午夜小视频免费观看 | 精品一区国产 | 国产精品久久久 | 日本免费一区二区三区四区 | 一本色道精品久久一区二区三区 | 欧美簧片 | 国产午夜精品一区二区 | 精品国产1区2区3区 一区二区手机在线 | 亚洲高清成人 | 99福利视频 | 99re国产视频 | 国产精品特级毛片一区二区三区 | 亚洲精品不卡 | 黄色在线免费看 | 亚洲欧美一区二区三区在线 | 成人免费淫片aa视频免费 | 久久久久久亚洲精品 | 欧美淫 | 欧美一级在线观看 | 国产精久久久 | 久久国产精品久久久久久 | 亚洲欧美在线视频 | 国产一区二区免费电影 | 免费中文字幕日韩欧美 | 91国内精品久久 | 午夜视频一区二区三区 | 91欧美激情一区二区三区成人 | 97伦理最新伦理 | 亚洲精品日韩在线观看 | 欧美 日韩 中文 | 亚洲影音先锋 | 国产精品欧美一区二区三区 | 日韩亚洲视频 | 午夜网站视频 | 欧美黑人一级爽快片淫片高清 | 欧美色人 | 涩涩视频网站在线观看 | 91九色网站 | 在线一区二区国产 | 国产日韩精品一区 |