使用WHERE子句中的嵌套JOIN简化代码

时间:2019-04-26 09:59:35

标签: sql postgresql join

我正在PostgreSQL中编写一条SQL语句,在这里我联接来自不同表的数据,每个表的ID由外键连接。表b的字段a_id与表a的ID相关,依此类推。

我的问题是我想在WHERE子句中重用联接表中的值,而不必再次执行所有的JOIN,就像这样:

SELECT *
FROM a
INNER JOIN b ON b.a_id = a.id
INNER JOIN c ON c.b_id = b.id
WHERE a.id = 3
AND a.x =
    (SELECT c.y
    FROM a
    INNER JOIN b ON b.a_id = a.id
    INNER JOIN c ON c.b_id = b.id
    WHERE a.id = 3
    AND c.id = 5)

我敢打赌我没有意识到这个片段有一个更简单的解决方案。如果有人可以帮助我,我会很高兴。

3 个答案:

答案 0 :(得分:1)

我没有一个简单的答案可以简化您的查询,但是CTE当然可以使您的查询更轻松:

±0

我的别名或列名可能已关闭,您可能需要整理一下CTE才能真正为您工作。

答案 1 :(得分:1)

您可以为此使用窗口功能:

SELECT . . .
FROM (SELECT a.*, b.*, c.*,  -- should  list the columns explicitly
             MAX(c.y) FILTER (WHERE c.id = 5) OVER () as y_5
      FROM a INNER JOIN
           b
           ON b.a_id = a.id INNER JOIN
           c
           ON c.b_id = b.id
      WHERE a.id = 3
    ) abc
WHERE abc.x = abc.y_5;

答案 2 :(得分:0)

希望下面提到的查询对您有所帮助。

SELECT *
FROM a
INNER JOIN b ON b.a_id = a.id
INNER JOIN c ON c.b_id = b.id
WHERE a.id = 3 and c.id =5 and a.x = c.y