我正在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)
我敢打赌我没有意识到这个片段有一个更简单的解决方案。如果有人可以帮助我,我会很高兴。
答案 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