In SQL standard ci sono senza parentesi in DISTINCT colA
. DISTINCT
non è una funzione.
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
Aggiunto DISTINCT
anche alla sotto-selezione. Se hai molti duplicati potrebbe velocizzare la query.
Un CTE potrebbe essere più veloce, a seconda del DBMS. Ho inoltre dimostrare LEFT JOIN
in alternativa per escludere i valori in valB
, e un modo alternativo per ottenere valori distinti con GROUP BY
:
WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM mytable m
LEFT JOIN x ON x.colB = m.colA
WHERE x.colB IS NULL
GROUP BY m.colA;
Oppure, semplificato ulteriormente, e con una sottoquery pianura (probabilmente più veloce):
SELECT DISTINCT m.colA
FROM mytable m
LEFT JOIN mytable x ON x.colB = m.colA
WHERE x.colB IS NULL;
Esistono fondamentalmente 4 tecniche per escludere le righe con chiavi presenti in un altro (o lo stesso) tabella:
Il fattore decisivo per la velocità sarà indici. È necessario disporre di indici su colA
e colB
affinché questa query sia veloce.
fonte
2012-01-05 03:07:45
'NOT IN' rallenta quando aumenta la dimensione impostata e spesso c'è un limite al numero di righe nella clausola' NOT IN'. Al di fuori dei piccoli set di risultati, ho trovato preferibile utilizzare altri mezzi per ottenere la differenza tra due set di risultati. – Paul
Quando si parla di prestazioni, è necessario assegnare un nome all'RDBMS o ottenere risposte non ottimali. –