子查询中两列的 Postgres where 子句
Postgres where clause over two columns from subquery
- 数据库:Postgres
- Table 姓名:
records
- 有 4 列
Year | Dept | Expense | Month
所以每年每个月/每个部门最多可以有一个记录。
我有一个子查询 returns 我根据约束获取以下数据。
Year | Dept
2001 | HR
2001 | ACC
2001 | TECH
2002 | TECH
2003 | HOUSE-KEEPING
2003 | TECH
现在我需要 运行 对同一个 table 进行另一个查询,以获得每个值对的总费用。
使用子查询的输出,我的主查询类似于
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
)
当我 运行 这个 select 语句时,返回的输出仅包含所有三年的 TECH 数据。
请帮助理解我如何 运行 主 select 子查询的所有行
将子查询重构为连接。
假设你有
SELECT a, b FROM t1 WHERE (x,y) IN (SELECT x1, y1 FROM t2 WHERE ...)
这行不通。你重写为
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;
注意,in PostgreSQL you shouldn't use a CTE (WITH query) for this。
你可以缩写
WHERE t1.x = some_alias.x1
AND t1.y = some_alias.y1;
到
WHERE (x, y) = (x1, y1)
虽然。
如果您没有数百万行,您可以通过将这些值连接成一个值来保持查询的语义:
select Dept, sum(Expense)
from records
where Year || Dept in (select Year || Dept from ...)
它易于阅读、理解和维护,除非您有无数年和部门,否则它会表现得很好,这似乎不太可能。
解决方案found here:
SELECT dept, SUM(expense) FROM records
WHERE ROW(year, dept) IN (SELECT x, y FROM otherTable)
GROUP BY dept;
ROW 函数很神奇。
- 数据库:Postgres
- Table 姓名:
records
- 有 4 列
Year | Dept | Expense | Month
所以每年每个月/每个部门最多可以有一个记录。
我有一个子查询 returns 我根据约束获取以下数据。
Year | Dept
2001 | HR
2001 | ACC
2001 | TECH
2002 | TECH
2003 | HOUSE-KEEPING
2003 | TECH
现在我需要 运行 对同一个 table 进行另一个查询,以获得每个值对的总费用。
使用子查询的输出,我的主查询类似于
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
)
当我 运行 这个 select 语句时,返回的输出仅包含所有三年的 TECH 数据。
请帮助理解我如何 运行 主 select 子查询的所有行
将子查询重构为连接。
假设你有
SELECT a, b FROM t1 WHERE (x,y) IN (SELECT x1, y1 FROM t2 WHERE ...)
这行不通。你重写为
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;
注意,in PostgreSQL you shouldn't use a CTE (WITH query) for this。
你可以缩写
WHERE t1.x = some_alias.x1
AND t1.y = some_alias.y1;
到
WHERE (x, y) = (x1, y1)
虽然。
如果您没有数百万行,您可以通过将这些值连接成一个值来保持查询的语义:
select Dept, sum(Expense)
from records
where Year || Dept in (select Year || Dept from ...)
它易于阅读、理解和维护,除非您有无数年和部门,否则它会表现得很好,这似乎不太可能。
解决方案found here:
SELECT dept, SUM(expense) FROM records
WHERE ROW(year, dept) IN (SELECT x, y FROM otherTable)
GROUP BY dept;
ROW 函数很神奇。