Вы можете добавить фиктивные null
столбцы во 2-м запросе, чтобы EXCEPT позволил выполнить инструкцию, например:
EXCEPT
(select core_blockedsongs_song.song_id, null, null,.... from core_blockedsongs
, но я думаю, что это не то, что вам нужно, потому что:
EXCEPT возвращает все строки, которые есть в результате запроса1, но не в результате запроса2
, что означает, что сравниваются полные строки. Я понимаю, что вы хотите исключить из результатов 1-го запроса все song_id
s, возвращенные 2-м запросом. Если это так, тогда вы можете использовать вместо NOT IN
, например:
select songs.id, songs.name, songs.artist, songs.album, songs.albumart, songs."albumartThumbnail",
cpr.votes, is_requested
from (
select id, name, artist, album, albumart, "albumartThumbnail"
from (
select song_id
from core_plsongassociation
where playlist_id in (1477)
) as sinpl left join songs
on sinpl.song_id=id
where explicit=False
) as songs left join (
select song_id, votes, bool_or(thirdpartyuser_id=177) as is_requested
from (
select *
from core_priorityrequests
where client_id=2876 and is_played=False
) as clpr left join core_priorityrequests_third_party_user
on clpr.id=priorityrequests_id
group by priorityrequests_id, song_id, votes
) as cpr on songs.id=cpr.song_id
where songs.id not in (
select core_blockedsongs_song.song_id
from core_blockedsongs join core_blockedsongs_song
on core_blockedsongs.id=core_blockedsongs_song.blockedsongs_id
where core_blockedsongs.unblock_flag = 'f' and core_blockedsongs.client_id=2870
);
Или с LEFT JOIN
из 2-го запроса, из которого вы отфильтруете соответствующие строки:
select songs.id, songs.name, songs.artist, songs.album, songs.albumart, songs."albumartThumbnail",
cpr.votes, is_requested
from (
select id, name, artist, album, albumart, "albumartThumbnail"
from (
select song_id
from core_plsongassociation
where playlist_id in (1477)
) as sinpl left join songs
on sinpl.song_id=id
where explicit=False
) as songs left join (
select song_id, votes, bool_or(thirdpartyuser_id=177) as is_requested
from (
select *
from core_priorityrequests
where client_id=2876 and is_played=False
) as clpr left join core_priorityrequests_third_party_user
on clpr.id=priorityrequests_id
group by priorityrequests_id, song_id, votes
) as cpr on songs.id=cpr.song_id
left join (
select core_blockedsongs_song.song_id
from core_blockedsongs join core_blockedsongs_song
on core_blockedsongs.id=core_blockedsongs_song.blockedsongs_id
where core_blockedsongs.unblock_flag = 'f' and core_blockedsongs.client_id=2870
) as c on c.song_id = songs.id
where c.song_id is null;