Присоединиться ко всем результатам подзапроса - PullRequest
0 голосов
/ 17 апреля 2020

Итак, я хочу LEFT JOIN все файлы, на которые ссылается хотя бы один из нескольких столбцов:

SELECT
    ...
FROM
    O o
    LEFT JOIN binary_stream_value bsv ON o.binary_stream_value_id = bsv.id
    LEFT JOIN artwork art ON o.artwork_id = art.id
    LEFT JOIN (SELECT f.id FROM file f WHERE f.id = bsv.file_id OR f.id = art.file_id) f ON TRUE
    ...

Это не так с

ERROR:  invalid reference to FROM-clause entry for table "bsv"
LINE 212: ...  LEFT JOIN (SELECT f.id FROM file f WHERE f.id = bsv.file_i...
                                                               ^
HINT:  There is an entry for table "bsv", but it cannot be referenced from this part of the query.

Правда, я наполовину ожидал этого потерпеть неудачу, наполовину надеясь, что я ошибаюсь.

Как правильно написать такой запрос?

1 Ответ

2 голосов
/ 17 апреля 2020

Вам нужно боковое соединение для того, что вы хотите сделать:

SELECT
    ...
FROM
    O o
    LEFT JOIN binary_stream_value bsv ON o.binary_stream_value_id = bsv.id
    LEFT JOIN artwork art ON o.artwork_id = art.id
    LEFT JOIN LATERAL (SELECT f.id FROM file f WHERE f.id = bsv.file_id OR f.id = art.file_id) f ON TRUE
    ...

Но суб-выбор не обязательно должен начинаться с:

SELECT
    ...
FROM
    O o
    LEFT JOIN binary_stream_value bsv ON o.binary_stream_value_id = bsv.id
    LEFT JOIN artwork art ON o.artwork_id = art.id
    LEFT JOIN file f on f.id = bsv.file_id OR f.id = art.file_id
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...