联接子查询的所有结果

所以我想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.

诚然,我一半希望这会失败,一半希望我错了。

编写这样的查询的正确方法是什么?

yanghao19840201 回答:联接子查询的所有结果

您需要进行横向连接:

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
    ...
本文链接:https://www.f2er.com/2422113.html

大家都在问