PostgreSQL: вложенный запрос к одной таблице

#sql #postgresql #subquery #inner-join #self-join

#sql #postgresql #вложенный запрос #внутреннее соединение #самосоединение

Вопрос:

Моя таблица выглядит (упрощенно) следующим образом:

 ID, File, Subst_ID
1, "AAA"
2, "BBB", 3
3, "CCC"
  

Он записывает имена файлов «File»; иногда файл (здесь BBB) заменяется более новым (здесь CCC».
Сначала покажите все записи, которые были заменены:

 SELECT ID, File, Subst_ID FROM Table WHERE Subst_ID IS NOT NULL;
  

ХОРОШО, появляется строка 2. Теперь мне нужно добавить столбец подзапроса QQ, который показывает файл замещающей записи, например, должен привести:

 2, "BBB", 3, "CCC"
  

. Мой подход не работает:

 SELECT ID, File, Subst_ID, (SELECT File FROM Table WHERE Subst-ID = ID) AS QQ FROM Table WHERE Subst_ID IS NOT NULL;
  

В чем моя ошибка? Спасибо!

Комментарии:

1. Могут ли быть замены заменителей?

2. «Не работает» — это недопустимое сообщение об ошибке Postgres.

3. Замена замены: Да, BBB теперь заменяется на CCC, это никогда не изменится. Но CCC может быть заменен на следующей неделе DDD.

4. Не работает: … более одной строки, возвращаемой вложенным запросом, используемым в качестве выражения

5. Каков ожидаемый формат вывода?

Ответ №1:

Я думаю, вам нужно самосоединение:

 select t1.*, t2.file as subst_file
from mytable t1
inner join mytable t2 on t2.id = t1.subst_id
  

Это запрос, который вы хотели написать — я нахожу это менее аккуратным, потому что для него требуется where предложение, в то время как приведенное выше не:

 select t1.*,
    (select t2.file from mytable t2 where t2.id = t1.subst_id) as subst_file
from mytable t1
where t1.subst_id is not null