久久久久久久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区 | 日韩精品视频一区二区三区 | 国产日韩一区二区三免费高清 | 成人影视网 | 2021天天躁夜夜看 | 蜜桃视频成人 | 免费能直接在线观看黄的视频 | 亚洲网站在线观看 | 日韩av啪啪网站大全免费观看 | 欧美一区二区三区在线看 | 男人的天堂久久 | 一区二区三区不卡视频 | 久久91精品久久久久久9鸭 | 9191在线播放| 成人精品一区二区户外勾搭野战 | 精品中文字幕在线 | 精品视频一区二区三区四区 | 色站综合| 91成人在线视频 | 欧美久久一区二区三区 | 羞羞的视频在线观看 | 国产一区二区在线观看视频 | 国产精品精品视频 | 日本精品视频一区二区三区四区 | 99精品一区二区 | 国内成人免费视频 | 久久99精品久久久久 | 久久久久久久国产精品影院 | 色网站在线 | 亚洲综合无码一区二区 | 日韩欧美视频在线 | 欧美aaa级 | 免费在线视频精品 | 91久久久久久 | 中国美女一级黄色片 | 美女131mm久久爽爽免费 | av中文字幕在线播放 |