代码片段将是我想要实现的目标的最佳示例:
SELECT
A.*, B.*, C.* D.*
FROM
tableA A
JOIN
tableB B ON A.id = B.a_id
JOIN
tableC C ON B.id = C.b_id
JOIN
tableD D ON C.id = D.c_id
WHERE
EXISTS (SELECT 1
FROM tableA A
JOIN tableB B ON A.id = B.a_id
JOIN tableC C ON B.id = C.b_id
JOIN tableD D ON C.id = D.c_id
WHERE D.column_name = 'desired_value');
我创建了一个数据库小提琴:https://www.db-fiddle.com/f/jA8jHqjAZ7opTx5qHPzpev/1
我想使用左连接选择 A、B、C 和 D 中的所有行。我只想选择具有与给定谓词匹配的远相关 D 记录的 A。我想为任何匹配的 A 选择所有 D 记录,即使这些 D 记录中除了一个之外的所有记录都与谓词匹配。简单地说 - 至少有一个必须满足谓词,但我们希望通过连接选择所有引用 A。
此处的代码示例已对此进行了简化。可能也有关于 B 和 C 的谓词,但我们仍然希望所有引用 A 的 B 和 C。
是否有比重复子查询中的所有联接以及必须使用带有更多联接的额外子查询来附加谓词更简单的方法?
你根本不需要 LEFT JOIN,你需要做的就是有一个与表的谓词匹配的 WHERE 子句,并使用它来选择感兴趣的 A.id,并在 IN 中使用它
SELECT
A.id
FROM
tableA A
JOIN
tableB B ON A.id = B.a_id
JOIN
tableC C ON B.id = C.b_id
JOIN
tableD D ON C.id = D.c_id
WHERE A.id IN (
SELECT
A.id
FROM
tableA A
JOIN
tableB B ON A.id = B.a_id
JOIN
tableC C ON B.id = C.b_id
JOIN
tableD D ON C.id = D.c_id
WHERE D.column_name = 'desired_value'
or WHERE C.column_name = 'desired_value'
or WHERE B.column_name = 'desired_value'
)
或者按照您更新的 DBFiddle 示例
SELECT a.*, b.*, c.*, d.*
FROM a A
JOIN b B ON A.id = B.a_id
JOIN c C ON B.id = C.b_id
JOIN d D ON C.id = D.c_id
WHERE a.id in (
SELECT a.id
FROM a A
JOIN b B ON A.id = B.a_id
JOIN c C ON B.id = C.b_id
JOIN d D ON C.id = D.c_id
WHERE D.x > 5
);