Qualcuno sa come eseguire tale query in Postgresql?Clausola NOT EXISTS in Postgresql
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB
WHERE tabB.id = tabA.id
)
Quando eseguo tale interrogazione, PostgreSQL si lamenta "ERROR: Greenplum Database does not yet support that query
."
EDIT: E che ne dite di questo:
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB WHERE tabB.id = tabA.id AND tabB.id2 = tabA.id2
)
EDIT:
ho provato in PostgreSQL 8.2.15 per i 4 risposte fornite dal @ypercube. Le conclusioni sono:
1) Il primo non funziona in questa versione di postgresql, come ho detto sopra nella domanda. Il messaggio di errore può essere trovato anche lì.
2) Per le altre tre risposte, la velocità di esecuzione è: (3) SINISTRA IN SINISTRA> (4) TRANNE >> (2) NON IN.
In particolare, per le query che hanno la stessa sintassi, (3) LEFT JOIN richiede circa 5580 ms, (4) EXCEPT impiega circa 13502ms e (2) NOT IN ne richiede più di 100000 (In effetti non ho aspettato util it finished).
C'è qualche motivo particolare per cui la clausola NOT IN è così lenta?
Cheng
PostgreSQL 8.2 è vecchio e non è più supportato. Ci sono stati importanti cambiamenti nel modo in cui le query "EXISTS" e "NOT EXISTS" funzionano da allora. http://www.postgresql.org/support/versioning/ – kgrittn
Se vuoi trovare la più efficiente delle query, penso che prima devi controllare gli indici che hai sulle tabelle.Non si menziona la dimensione dei tavoli ma 5 secondi per una query significa (99%) o tabelle enormi o mancanza di indici. Suggerisco di aggiungere una nuova domanda, comprese le definizioni ('CREATE TABLE') delle due tabelle, le query e i piani di esecuzione. –