2013-04-16 59 views
10

我遇到了從PostgreSQL表中刪除記錄的問題,使用LEFT JOIN如何使用外連接刪除行

我想刪除行我用下面的查詢得到:

SELECT * FROM url 
LEFT JOIN link_type ON url.link_type = link_type.id 
WHERE link_type.id IS NULL 

要做到這一點,這裏是我做過什麼:

DELETE FROM url 
USING link_type 
WHERE url.link_type = link_type.id AND link_type.id IS NULL 

查詢工作,但不會刪除任何東西,儘管這正是文檔中所解釋的:http://www.postgresql.org/docs/current/static/sql-delete.html

我的問題是由於IS NULL在查詢還是我缺少什麼東西?

+4

它不會刪除任何東西,因爲當'link_type.id'爲空時,'url.link_type = link_type.id'不是真的,所以這兩個條件永遠都不會滿足。 –

回答

6

還是不明白,爲什麼我以前的查詢不起作用(如果有人可以解釋,將是不錯),但這裏是我的伎倆:

DELETE FROM url WHERE NOT EXISTS (SELECT * FROM link_type WHERE url.link_type = link_type.id); 
+2

因爲如果「url.link_type = link_type.id」是「TRUE」,那麼「link_type.id」_is不是「NULL」_,如果「link_type.id」是「NULL」第一個條件「url.link_type = link_type.id 「將返回」NULL「,那麼你會得到」NULL AND TRUE「,它只是」NULL「。由於NULL是一個未知值,因此不能說它是TRUE或FALSE,因此不顯示任何行。不存在會爲你工作。 – Guedes

10

好工作,曬太陽。小提示:使用EXISTS/NOT EXISTS時,您不需要SELECT *。一個常見的約定(docs)是隻寫SELECT 1像這樣:

DELETE FROM url WHERE NOT EXISTS (
    SELECT 1 FROM link_type WHERE url.link_type = link_type.id 
); 

在功能上,兩者的工作方式。