#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