Postgres where子句来自子查询的两列

Vik*_*k G 2 sql postgresql select subquery where-clause

  • 数据库:Postgres
  • 表名: records
  • 有4列 Year | Dept | Expense | Month

因此,每年/每个部门最多可以有一个记录.

我有一个子查询,它根据约束返回下面的数据.

Year | Dept
2001 | HR
2001 | ACC
2001 | TECH
2002 | TECH
2003 | HOUSE-KEEPING
2003 | TECH
Run Code Online (Sandbox Code Playgroud)

现在,我需要在同一个表上运行另一个查询,以获得每个值对的总计费用.

使用子查询的输出,我的主要查询将是类似的

select Dept, sum(Expense) 
from records 
where (Year, Dept) in (...)
... I want to iterate over value pairs from the subquery

(SUBQUERY which returns
Year | Dept
2001 | HR
2001 | ACC
2002 | TECH
2003 | HOUSE-KEEPING
)
Run Code Online (Sandbox Code Playgroud)

当我运行这个select语句时,返回的输出仅包含三年内TECH的数据.

请帮助理解我如何在子查询的所有行上运行主选择

Cra*_*ger 9

将子查询重构为连接.

说你有

SELECT a, b FROM t1 WHERE (x,y) IN (SELECT x1, y1 FROM t2 WHERE ...)
Run Code Online (Sandbox Code Playgroud)

哪个不行.你重写了

SELECT a, b
FROM t1
INNER JOIN (
   -- subquery here:
   SELECT x1, y1
   FROM t2
   WHERE ...
) AS some_alias
WHERE t1.x = some_alias.x1
  AND t1.y = some_alias.y1;
Run Code Online (Sandbox Code Playgroud)

请注意,在PostgreSQL中,您不应该使用CTE(WITH查询).

你可以缩写

WHERE t1.x = some_alias.x1
  AND t1.y = some_alias.y1;
Run Code Online (Sandbox Code Playgroud)

WHERE (x, y) = (x1, y1)
Run Code Online (Sandbox Code Playgroud)

虽然.

  • “内部联接”不需要“接通”吗? (3认同)
  • @咆哮者是的。我认为应该是“开”而不是“在”。不再记得了,没有时间重新检查。 (3认同)

Le *_*oid 7

在这里找到解决方案:

SELECT dept, SUM(expense) FROM records 
WHERE ROW(year, dept) IN (SELECT x, y FROM otherTable)
GROUP BY dept;
Run Code Online (Sandbox Code Playgroud)

ROW函数发挥了神奇作用。


Dom*_*eon 7

现在到 2022 年,您可以直接执行以下操作:

SELECT dept, SUM(expense) FROM records 
WHERE (year, dept) IN (SELECT year, dept FROM otherTable);
Run Code Online (Sandbox Code Playgroud)