SQL/PSQL Ссылка на имена столбцов в предложении where после перекрестного соединения одной и той же таблицы друг с другом

Я пытаюсь понять, как ссылаться на определенные столбцы из перекрестного соединения, когда вы перекрестно соединяете таблицу с самой собой. Таблице перекрестного соединения в целом также дается псевдоним, поэтому у меня возникают проблемы с доступом к именам столбцов, поскольку она также естественным образом связана с другим подзапросом. Вот код:

select q0.sid, q0.sname 
from (buys t1 cross join student s3 cross join student s4) q0 natural join 
     (select s5.sid, s5.sname, s6.sid, s6.sname, t3.sid, t3.bookno                                                                      
      from buys t2 cross join student s5 cross join student s6 cross join buys t3                                                                       
      where t2.sid = s5.sid and t3.bookno = t2.bookno) q1
where t1.sid = s3.sid;

Проблема в том, что предложение «где» пытается сравнить t1.sid и s3.sid, потому что q0.sid неоднозначен. Как получить доступ к этим столбцам из перекрестного соединения?


person Min Park    schedule 02.11.2017    source источник
comment
Используйте столбец псевдоним, например SELECT s5.sid AS s5_sid, s6.sid AS s6_sid.   -  person Serge    schedule 02.11.2017
comment
Ну тут не в этом проблема. Я не могу получить доступ к t1.sid и s3.sid внутри первого перекрестного соединения для того, где класс в конце   -  person Min Park    schedule 02.11.2017
comment
Вам нужно провести рефакторинг (buys t1 cross join student s3 cross join student s4). Как насчет чего-то вроде (SELECT t1.sid AS t1_sid, s3.sid AS s3_sid, s4.sid AS s4_sid FROM buys t1 CROSS JOIN student s3 CROSS JOIN student s4?   -  person Serge    schedule 02.11.2017


Ответы (2)


NATURAL join — это странность стандартного SQL, который редко бывает полезен и очень сложен. Я бы вообще не стал его использовать.

Предложение USING в условии соединения почти такое же короткое и не такое подверженное ошибкам (в случае изменения столбцов в базовых таблицах или редактирования списка FROM запроса). Некоторые специалисты по SQL даже не одобряют предложение USING, поскольку оно легче ломается, чем более явное предложение ON. Я не с ними.

В вашем конкретном запросе производные таблицы q0 и q1 имеют повторяющиеся имена столбцов, что делает невозможным использование соединения NATURAL, а также любую попытку сослаться на неоднозначные имена столбцов вообще. . Сюда входят неоднозначные ссылки q0.sid, q0.sname во внешнем списке SELECT (таблица student дважды включена в q0). Кроме того, список SELECT в подзапросе q1 не имеет смысла, столбцы нигде не используются.

Ваш запрос не работает в нескольких местах, вы его переписали. Ваш вопрос должен начинаться с описания того, чего должен достичь запрос, точного определения таблицы и версии Postgres.

person Erwin Brandstetter    schedule 02.11.2017

Я нашел ответ благодаря помощи моего профессора. Вы должны жестоко переименовать каждое имя столбца, используя операторы With. Таким образом, это будет выглядеть следующим образом:

with e1 as (select t1.sid as t1sid, t1.bookno as t1bookno,
                   s1.sid as s1sid, s1.sname as s1sname,
                   s2.sid as s2sid, s2.sname as s2sname
            from buys t1 cross join student s1 cross join student s2),
     e2 as (select t1.sid as t1.sid, etc as etc) 

Это просто жестокий метод переименования каждого столбца, который вам нужен, но он работает. Извините, я не указал в вопросе, что я пытался сделать прямой перевод в реляционную алгебру в SQL. Спасибо всем, кто пытался помочь!

person Min Park    schedule 03.11.2017