2016-11-02 158 views
1

我是SQL Server的初學者。我試圖解決這個問題:SQL Server 2014:僅選擇與其他表中的所有行匹配的行

從「ItemTag」表中選擇所有(不同的)「item_id」,其對應的「tag_id」值至少與「UserTagList」表中的所有值相匹配。

我嘗試了加入以下而是結果我得到的查詢應該返回ITEM_ID 5,因爲它具有TAG_ID的3 & 4.

任何幫助深表感謝。

下面是SQL架構

SQL Fiddle

的SQL Server 2014架構設置:

CREATE TABLE UserTagList (id INT); 

INSERT INTO UserTagList (id) 
VALUES (3), (4); 

CREATE TABLE ItemTag (id INT, item_id INT, tag_id INT); 

INSERT INTO ItemTag (id, item_id, tag_id) 
VALUES (1, 5, 3), (2, 5, 4), (3, 5, 6), (4, 6, 3), (5, 7, 4); 

查詢1

SELECT i.item_id, i.tag_id 
FROM ItemTag AS i 
JOIN UserTagList AS u ON i.tag_id = u.id 

Results

| item_id | tag_id | 
|---------|--------| 
|  5 |  3 | 
|  5 |  4 | 
|  6 |  3 | 
|  7 |  4 | 

回答

0

這是一個查詢,其中group byhaving是有用的:

select i.item_id 
from ItemTag i join 
    UserTagList u 
    on i.tag_id = u.id 
group by i.item_id 
having count(*) = (select count(*) from UserTagList); 
+0

這對我的問題非常合適。如果UserTagList表中存在「no」或「some」tag_id的匹配項,並且僅返回具有UserTagList表中所有標籤的項目,則返回0結果。謝謝@Gordon Linoff – rad123

0

我會用左手與聚集一起在這裏:

SELECT t1.item_id 
FROM ItemTag t1 
LEFT JOIN UserTagList t2 
    ON t1.tag_id = t2.id 
GROUP BY t1.item_id 
HAVING SUM(CASE WHEN t2.id IS NULL THEN 1 ELSE 0 END) = 0 

這裏的邏輯是,如果對於給定的item_id組,其一個或多個標籤與UserTagList表中的任何內容都不匹配,則th在HAVING子句中的總和將檢測並計數空和不匹配的記錄。

相關問題