2016-06-12 94 views
0

我試圖建立一個請求來從表中獲取數據,但其中一些列有外鍵,我想用一個請求中的關聯關鍵字替換這些外鍵。Postgresql從字典中獲取參考

基本上有一個與第1列

表A中:PKA-ID和列2:名稱。 表B第1列:PKB-ID,第2列:FKA-ID第3列:金額。

我想在表B,而由相關聯的名稱表A代替

我開始建設有一個子請求+別名來獲得一個請求的所有外鍵的所有行,但OFC我有每個子請求的結果不止一個,但我找不到將子請求與主表請求中的表B的ID關聯的方式[可能已被用盡,無論是雙重還是兩者]。我做了這樣的事情:

SELECT (SELECT "NAME" FROM A JOIN B ON ID = FKA-ID) AS name, amount FROM TABLEB; 

感覺這麼簡單但又請求......

回答

0

你不需要在子選擇一個連接。

SELECT pkb_id, 
    (SELECT name FROM a WHERE a.pka_id = b.fka_id), 
    amount 
FROM b; 

(看到它住在SQL Fiddle)。

子選擇查詢爲其父選擇的每一行運行,並且具有可從上下文獲得的父行。


您還可以使用簡單的連接。

SELECT b.pkb_id, a.name, b.amount 
FROM b, a 
WHERE a.pka_id = b.fka_id; 

注意,加入版本穿PostgreSQL的查詢優化器限制少所以在某些情況下,加入的版本可能會工作得更快。 (例如,在PostgreSQL 9.6中,連接可能使用多個CPU單元,參見Parallel Query)。

+0

謝謝,這有幫助,我目前正在尋找自己,但我會在同時問:實際上有兩個引用到A表中,有兩個FKA,它們在理論上可能是相同的,但大多數時候他們不是,它會如何適用? – aurawastaken

+0

嘗試類似但沒有的東西:SELECT b。「ID」,a。「fka」as n1,b。「VALUE1」,a。「fka」as n2,b。「VALUE2」,b。「VALUE3」,b 。「VALID」FROM public。「BTABLE」as b,public。「ATABLE」as WHERE n1 = a。「ID」AND n2 = a。「ID」 – aurawastaken

+0

好吧,你幫助我重新創建我的問題並解決它SQL小提琴:http://sqlfiddle.com/#!9/94ba69/8,但我不知道它是如何工作的,因爲我從來沒有在子請求中引用TABLEB,我認爲這讓我感到困惑,不管怎樣,謝謝! [選擇'PK-ID-B',(從TABLEA選擇'名稱',其中'FKA-ID1'='PK-ID-A'),'VALUE1',(從'TABLEA選擇'名稱'FKA- ID2' ='PK-ID-A'),'VALUE2' FROM TABLEB;] – aurawastaken