2017-09-27 36 views
0

我有兩個在Postgres表:PostgreSQL的聯接與多個條件

worker_details_verification (verification_id BIGSERIAL, worker_id BIGINT, 
state TEXT, proofs TEXT[]) 
worker_details(worker_id BIGINT, name TEXT) 

現在我想

`verification_id, worker_id, proofs FROM` the table 
    `worker_details_verification` 

限制記錄`WHERE狀態= '初始'

現在除了上面的三列中,我還需要worker_details表中的名稱列,其中worker_id可用於查詢工作人員的姓名。

我試過以下查詢,但沒有奏效。

SELECT a.verification_id, a.worker_id, a.state, a.proofs, b.Name FROM 
worker_details_verification a FULL OUTER JOIN worker_details b ON 
a.worker_id = b.worker_id AND a.state = 'Initial'; 

它返回的記錄,甚至a.state不'Initial',並從那裏所有worker_detailname返回與NULLworker_details_verification列的一些錯誤的記錄。

+0

對不同類型的閱讀起來的聯接:INNER <左,右,全外,交叉連接的https:/ /blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – xQbert

回答

0

這聽起來對我來說,不是一個完全外部聯接,你會想要一個左/右,因爲你正在尋找從Worker_Details_Verification數據,然後篩選,同時還抓住Worker_Details適用。

我把這個:

SELECT a.verification_id, a.worker_id, a.state, a.proofs, b.Name 
FROM worker_details_verification a 
    FULL OUTER JOIN worker_details b ON a.worker_id = b.worker_id AND a.state = 'Initial'; 

,並使它變成這樣:

SELECT a.verification_id, a.worker_id, a.state, a.proofs, b.Name 
FROM worker_details_verification a 
    LEFT OUTER JOIN worker_details b ON a.worker_id = b.worker_id 
WHERE a.state = 'Initial'; 
+0

這兩個答案都起作用(INNER JOIN和FULL OUTER JOIN)。是否有任何因素(如表現)可以用來選擇一個嗎? –

+0

我根據數據的相關性來處理它。如果我確切知道Worker_Details不缺少Worker_Details_Verification中的任何Worker_Ids,我會選擇內部連接。如果存在不確定性,我會使用外連接(左或右)。我只能想到我有一段時間需要全職外援加入我的職業生涯。 –

+0

oops。我的意思是:「左外連接(你的回答)」和內連接(另一個答案)。不是「全外連接」(我輸入錯誤)。 –

0

你試過這樣嗎?

SELECT a.verification_id, a.worker_id, a.state, a.proofs, b.Name 
FROM worker_details_verification a 
INNER JOIN worker_details b ON a.worker_id = b.worker_id 
WHERE a.state = 'Initial'; 
+0

這兩個答案都有效(INNER JOIN和FULL OUTER JOIN)。是否有任何因素(如表現)可以用來選擇一個嗎? –