我有一个
艺术家表id, name
乐队表id, name, genre
乐队艺术家表artistid, bandid
而我正试图查询所有不在摇滚乐队中演出的艺术家(艺术家可以在多个乐队中演奏。
以下查询有效:
SELECT a.name
FROM arIst a
WHERE NOT EXISTS
(SELECT *
FROM arIst a, bandMembers bm, band b
WHERE a.id = bm.arIstID
AND bm.id = b.id
AND b.genre = “rock");
但我正试图通过以下方式实现它:
select a.name
from artists a, band b, band-artist ba
where a.id=ba.artistid and b.id=ba.bandid
group by(a.id)
HAVING ??? <--- here I am stuck
如何按组显示组,组中的所有行都遵循某些规则?
这是band.genre != 'rock'
首先,你需要一个left join
,因为一些艺术家可能不在任何乐队。其次,永远不要在from
条款中使用逗号。始终使用正确,明确,标准的join
语法。
select a.id, a.name -- in case two artists have the same name
from artists a left join
band_artist ba
on a.id = ba.artistid left join
band b
on b.id = ba.bandid
group by a.id, a.name
having sum(band.genre = 'rock') = 0; -- the number of rock bands is 0