2017-09-25 60 views
1
  • 数据库条款在两列:Postgres的
  • 表名:records
  • 有4列Year | Dept | Expense | Month

所以每年可以有长达一个记录每个月/每个部门。Postgres的,其中来自子查询

我有一个子查询,它返回基于约束的下面的数据。

Year | Dept 
2001 | HR 
2001 | ACC 
2001 | TECH 
2002 | TECH 
2003 | HOUSE-KEEPING 
2003 | TECH 

现在我需要在同一张桌子上运行另一个查询来获得每个值对的总费用。

使用子查询的输出,我的主查询将会像

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在所有三年。

请可以帮助理解我怎么可以运行子查询

回答

3

重构子查询到加盟的主要选择在所有行。

说你有

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) 

虽然。

+1

非常感谢Craig的回复。这会让我开始。我应该在最初的问题中提供更多细节。我的子查询是使用with查询形成的。为了简化应答部分,我简化了实际的数据库。你的回答让我意识到这不是一个好主意。我将发布一个包含所有细节的新问题。 再次感谢您的帮助。 –

+0

嗨克雷格 - 我已经重新发布这里的所有细节问题 - https://stackoverflow.com/questions/46425141/postgres-where-clause-over-two-columns –

0

如果你没有得到数百万行的,你可以保持语义查询的通过连接值到一个值:

select Dept, sum(Expense) 
from records 
where Year || Dept in (select Year || Dept from ...) 

这很容易阅读,理解和维护,它会执行除非你拥有数以万计的年份和部门,否则这似乎不太可能。