Выбор неоднозначного столбца из подзапроса с помощью postgres join внутри - PullRequest
0 голосов
/ 26 сентября 2018

У меня следующий запрос:

select x.id0 
from (
  select * 
  from sessions 
     inner join clicked_products on sessions.id0 = clicked_products.session_id0 
) x;

Поскольку id0 находится в sessions и clicked_products, я получаю ожидаемую ошибку:

ссылка на столбец«id0» является неоднозначным

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

select sessions.id0 
from (
   select * 
   from sessions 
     inner join clicked_products on sessions.id0 = clicked_products.session_id0 
) x;

Однако это приводит к следующей ошибке:

отсутствует запись предложения FROM для таблицы "сеансы"

Как мне вернуть только столбец id0 из вышеприведенного запроса?

Примечание: я понимаю, что могу легко решить проблему, избавившись от подзапроса все вместе:

select sessions.id0 
from sessions 
  inner join clicked_products on sessions.id0 = clicked_products.session_id0;

Однако мне нужно выполнить дополнительные агрегации и, следовательно, нужно сохранить подзапроссинтаксис.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Единственный способ сделать это - использовать псевдонимы для столбцов, возвращаемых из подзапроса, чтобы имена больше не были неоднозначными.

Квалификация столбца с именем таблицы не работает, потому что sessions не отображается в этой точке (только x есть).

Правда, таким образом вы не можете использовать SELECT *, но вы все равно не должны этого делать.По какой-то причине ваш запрос является прекрасным примером:
Представьте, что у вас есть запрос, подобный вашему, который работает, а затем кто-то добавляет новый столбец с тем же именем, что и столбец в другой таблице.Тогда ваш запрос неожиданно и загадочно прерывается.

Избегайте SELECT *.Это нормально для специальных запросов, но не в коде.

0 голосов
/ 26 сентября 2018
select x.id from
 (select sessions.id0 as id, clicked_products.* from sessions
 inner join
 clicked_products on
 sessions.id0 = clicked_products.session_id0 ) x;

Однако вы должны указать другие столбцы из сеансов таблицы, поскольку вы не можете использовать SELECT *

0 голосов
/ 26 сентября 2018

Полагаю:

select x.id from (select sessions.id0 id
  from sessions 
  inner join clicked_products 
  on sessions.id0 = clicked_products.session_id0 ) x;

должно работать.

Другой вариант - использовать Общее табличное выражение , которое более читабельно и его проще тестировать.Но все равно нужен псевдоним или выбор уникальных имен столбцов.

В общем случае выбор всего с помощью * не очень хорошая идея - чтение всех столбцов - пустая трата ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...