Sql необработанный запрос не работает должным образом - PullRequest
0 голосов
/ 15 апреля 2020

Я использую условие исключения в своем запросе, но я получаю сообщение об ошибке, как показано ниже:

Текстовый формат запроса:

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 
                EXCEPT
                (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);

Причина вышеуказанной ошибки происходит из-за разницы в столбцах в запросах, которые ниже и выше предложения , за исключением , т. е. столбцов в запросе, который написан над исключением содержит больше столбцов, чем запрос, после предложения exc, содержащего только 1 (один) столбец.

Может кто-нибудь предложить какой-нибудь обходной путь / решение в качестве улучшения в запросе, который написан, за исключением того, что у меня нет добавить в него все столбцы?

1 Ответ

1 голос
/ 15 апреля 2020

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