2017-09-25 80 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 ...) 

這很容易閱讀,理解和維護,它會執行除非你擁有數以萬計的年份和部門,否則這似乎不太可能。