我是SQL Server的初学者。我正在努力解决这个问题:
从“ItemTag”表中选择所有(不同)“item_id”,其对应的“tag_id”值至少与“UserTagList”表中的“all”值匹配。
我在下面尝试了一个连接,但是我得到的查询结果应该返回item_id 5,因为它有tag_id的3& 4。
非常感谢任何帮助。
以下是SQL架构
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 :(得分:0)
这是group by
和having
有用的查询:
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);
答案 1 :(得分: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
表中的任何内容都不匹配,那么HAVING
中的总和子句将检测并计算空和不匹配的记录。