2013-04-16 26 views
10

Ho un problema per eliminare i record da una tabella PostgreSQL, utilizzando un LEFT JOIN.Come eliminare righe utilizzando un join esterno

mi piacerebbe eliminare le righe che ottengo con la seguente query:

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

Per farlo, qui è quello che ho fatto:

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

opere query, ma non cancella nulla , anche se questo è esattamente ciò che è spiegato nel documento: http://www.postgresql.org/docs/current/static/sql-delete.html.

Il mio problema è dovuto a IS NULL nella query o Mi manca qualcosa?

+4

Non cancella nulla perché quando 'link_type.id' è nullo, 'url.link_type = link_type.id' non è vero, quindi queste due condizioni non sono mai soddisfatte insieme. –

risposta

6

ancora non capisco il motivo per cui la mia domanda precedente non funziona (se qualcuno potrebbe spiegare, sarebbe bello), ma ecco come lo ha fatto il trucco:

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

Perché se "url.link_type = link_type.id" è "TRUE", quindi "link_type.id" _non è "NULL" _, se "link_type.id" è "NULL" la prima condizione "url.link_type = link_type.id "restituirà" NULL "anche tu ottieni" NULL AND TRUE "che è solo" NULL ". Poiché NULL è un valore sconosciuto, non puoi dire che sia VERO o FALSO, quindi nessuna riga viene visualizzata. Il NON ESISTE sarà al lavoro per te. – Guedes

10

Buon lavoro, sole. Suggerimento minore: quando si utilizzano EXISTS/NOT EXISTS non è necessario SELECT *. Una convenzione comune (docs) è quello di scrivere semplicemente SELECT 1 come in questo modo:

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

punto di vista funzionale, in entrambe le direzioni di lavoro.

Problemi correlati