SQL group by并仅保留包含列的给定值的组

SQL group by并仅保留包含列的给定值的组,sql,select,group-by,having,Sql,Select,Group By,Having,我有一张歌曲表,一张歌词表和一张标签表。一首歌可能有多首歌词(或没有),而每首歌词只有一个标签。因此,在歌词表中,我有两个外键,song\u id和tag\u id,它们都链接到相应表中的记录 我想选择所有没有给定标记的歌曲。例如,给定以下视图(三个表是internaljoined): 给定“hip-hop”标签,我需要检索第二首歌曲,因为它没有链接的歌词,而链接的标签具有“hip-hop”值 如果我给“pop”标签,就不会检索到任何歌曲,因为这两首歌都有一首歌词链接了“pop”标签 如何以最佳

我有一张
歌曲
表,一张
歌词
表和一张
标签
表。一首歌可能有多首歌词(或没有),而每首歌词只有一个标签。因此,在
歌词
表中,我有两个外键,
song\u id
tag\u id
,它们都链接到相应表中的记录

我想选择所有没有给定标记的歌曲。例如,给定以下视图(三个表是
internaljoin
ed):

给定“hip-hop”标签,我需要检索第二首歌曲,因为它没有链接的歌词,而链接的标签具有“hip-hop”值

如果我给“pop”标签,就不会检索到任何歌曲,因为这两首歌都有一首歌词链接了“pop”标签


如何以最佳方式构建这样的查询?我想按
song\u id
进行分组,然后做
have(tag\u value!=“hip-hop”)
,但不幸的是
have
不是这样工作的。

这是
[not]exists
操作符的经典用例:

SELECT *
FROM   songs s
WHERE  NOT EXISTS (SELECT *
                   FROM   lyrics l
                   JOIN   tags t ON l.tag_id = t.id
                   WHERE  l.song_id = s.id AND 
                          t.tag_value = 'hip-hop') -- or any other tag
SELECT *
FROM   songs s
WHERE  NOT EXISTS (SELECT *
                   FROM   lyrics l
                   JOIN   tags t ON l.tag_id = t.id
                   WHERE  l.song_id = s.id AND 
                          t.tag_value = 'hip-hop') -- or any other tag