首页 > 解决方案 > Postgres 在 where 子句中引用子查询结果

问题描述

我写了这个查询:

select *
from user.bet_lang_translation trans
inner join (
    select id, fixture_id, name, price, status
    from user.bet
    where bet.status = 'open'
) res
on trans.bet_id = res.id

结果是这样的:

|bet_id           |name     |bits                 |id               |fixture_id|name|price   |status|
|-----------------|---------|---------------------|-----------------|----------|----|--------|------|
|14861177884454004|goal_diff|000000000010000000000|14861177884454004|4454004   |X   |4.000000|open  |
|14861177184454004|goal_diff|111111111100000000000|14861177184454004|4454004   |2   |1.750000|open  |
|14861177174454004|goal_diff|000000000001111111111|14861177174454004|4454004   |1   |4.200000|open  |

我的目标是现在将这个查询的结果与其自身连接两次,这样我就可bet_id以为每个灯具制作独特的组合。也许这也适用于 CROSS JOIN。

为了获得一种组合,我尝试将其添加到查询的底部:

inner join res as a
on res.fixture_id = a.id

但我得到一个错误:[42P01] ERROR: relation "res" does not exist

我知道这是因为查询的两个部分是并行执行的,所以不能交叉引用。我已经阅读过LATERAL但不确定这是否会对我有所帮助。

有什么想法可以在这里实现我所需要的吗?

标签: sqlpostgresql

解决方案


要详细说明 CTE 如何做您想做的事:

WITH res AS (
   SELECT id, fixture_id, name, price, status
   FROM user.bet
   WHERE bet.status = 'open'
)
SELECT *
FROM user.bet_lang_translation trans
   JOIN res res1 ON trans.bet_id = res1.id
   JOIN res res2 ON res1.fixture_id = res2.id;

CTE 将只计算一次然后具体化,如果您想使用两次,这很有效。


推荐阅读