有没有一种简单的方法来选择第三个或第四个关系的所有引用记录,其中至少一个(IN 运算符)匹配?

问题描述 投票:0回答:1

代码片段将是我想要实现的目标的最佳示例:

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。

是否有比重复子查询中的所有联接以及必须使用带有更多联接的额外子查询来附加谓词更简单的方法?

sql join filter relation
1个回答
0
投票

你根本不需要 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
);
© www.soinside.com 2019 - 2024. All rights reserved.