sql - 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
但不确定这是否会对我有所帮助。
有什么想法可以在这里实现我所需要的吗?
解决方案
要详细说明 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 将只计算一次然后具体化,如果您想使用两次,这很有效。
推荐阅读
- c# - Asp.net core如何在viewmodel实体框架中加载相关数据
- matlab - 将温度时间序列插值到压力网格上
- android - 如何修复“错误:链接引用失败”更新 Admob 所需的 firebase 依赖项后出现此错误
- javascript - 为什么我从 vue.js 组件脚本中的简单 for 循环中得到“我未定义”错误?
- javascript - 在 while 循环中设置不允许的内容的问题
- javascript - '!!user' 是做什么用的?这条线的结果是什么?
- haskell - 了解 Haskell 中的键值构造函数
- javascript - 观察现有对象的对象属性变化
- angular - 如何转换此 DateTime 使其在 Angular Material 中看起来不错
- python - 如何用 mock.patch 覆盖 Django 视图进行测试?