выбрать группу по строкам, которые следуют некоторому атрибуту - PullRequest
0 голосов
/ 11 января 2019

У меня есть
таблица артистов 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'

1 Ответ

0 голосов
/ 11 января 2019

Во-первых, вам нужен 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...