2011-07-28 80 views
2

我在查詢時遇到了麻煩。我有以下3個表:SQL查詢幫助(Postgresql)

documents (
    id, 
    title 
); 

positions (
    id, 
    title 
); 

documents_positions (
    document_id, 
    position_id 
); 

什麼,我試圖讓(我的請求的結果)是文檔的矩陣,它們適用於什麼樣的立場。所以每一行都有文檔標題,如果位置適用於文檔,則每個行都有一個列,每個位置都有一列,旁邊有一列有True或False。我懷疑需要某種左連接,因爲在文檔之後的每一行中,我想列出位置表中的每個位置以及文檔是否適用於它。合理?

+1

您能否提供輸入數據和預期結果數據? – Bohemian

回答

1

你可以使用一個cross join構建矩陣,然後left join找到在矩陣中的位置被填補:

select d.title 
,  p.title 
,  case when dp.document_id is null then 'hrmm' else 'HALLELUJAH' end 
from documents d 
cross join 
     positions p 
left join 
     documents_positions dp 
on  dp.document_id = d.id 
     and dp.position_id = p.id 
+0

這給了我正確的數據,但我怎樣才能讓輸出成爲每個位置與文檔位於同一行的位置? – Pyrite

+0

@Pyrite:這就是所謂的「旋轉」。 Excel可以爲你或大多數其他報告工具做到這一點。 SQL不喜歡可變數量的列,使得在純SQL中無法實現樞軸轉動。 – Andomar

+0

我想我的意思是說,如何在Postgresql的PIVOT結果? – Pyrite

1

既然你想打開positions行轉換成列,你必須「轉動」他們。在PostgreSQL中,這是通過crosstab函數完成的。然而,crosstab似乎要求您定義查詢中輸出列的數量,因爲positions中的行數可能會發生更改,您無法執行此操作。 我自己並不是PostgreSQL用戶,所以也許有一些技巧來構建我不知道的動態查詢,但它似乎更容易使用像Andomar發佈的查詢,然後在您的客戶端代碼中將這些行旋轉。

+0

你在這個假設中是正確的。 – Pyrite