Postgres在where子句

时间:2019-07-16 12:59:27

标签: sql postgresql

我写了这个查询:

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的信息,但不确定是否对我有帮助。

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

1 个答案:

答案 0 :(得分:2)

要阐明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,然后将其实现,如果您想使用两次,这将非常有效。