Ktoś wie, jak wykonać takie zapytanie w Postgresql?Klauzula NOT EXISTS w Postgresql
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB
WHERE tabB.id = tabA.id
)
Kiedy wykonać takie zapytanie, PostgreSQL narzeka "ERROR: Greenplum Database does not yet support that query
".
EDIT: I jak o tym jednym:
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB WHERE tabB.id = tabA.id AND tabB.id2 = tabA.id2
)
EDIT:
testowałem w PostgreSQL 8.2.15 dla 4 odpowiedzi udzielone przez @ypercube. Wnioski są następujące:
1) Pierwszy nie działa w tej wersji postgresql, jak wspomniałem powyżej w pytaniu. Tam też można znaleźć komunikat o błędzie.
2) Dla pozostałych trzech odpowiedzi prędkość wykonania wynosi: (3) LEWY DOŁĄCZ> (4) Z WYJĄTKIEM >> (2) NIE IN.
W szczególności dla zapytań, które mają tę samą składnię, (3) LEWY POŁĄCZENIE trwa około 5580 ms, (4) WYJĄTEK zajmuje około 13502 ms, a (2) NIE przyjmuje więcej niż 100000 (W rzeczywistości nie czekałem, aż skończy się).
Czy istnieją jakieś szczególne powody, dla których klauzula NOT IN jest tak powolna?
Cheng
PostgreSQL 8.2 jest stary i nie jest już obsługiwany. Nastąpiły poważne zmiany w działaniu zapytań "EXISTS" i "NOT EXISTS". http://www.postgresql.org/support/versioning/ – kgrittn
Jeśli chcesz znaleźć najbardziej efektywne zapytania, myślę, że najpierw musisz sprawdzić indeksy na tabelach.Nie wspomnisz o wielkości tabel, ale 5 sekund dla zapytania oznacza (99%) albo wielkie tabele, albo brak indeksów. Sugeruję dodanie nowego pytania, w tym definicji ('CREATE TABLE') dwóch tabel, zapytań i planów wykonania. –