Come posso implementare le operazioni SQL INTERSECT e MINUS in MS Access

Ho ricercato e non ho trovato un modo per eseguire operazioni INTERSECT e MINUS in MS Access. Esiste un modo

INTERSECT è un join interno. MINUS è un join esterno, in cui si scelgono solo i record che non esistono nell’altra tabella.


INTERSECT

select distinct a.* from a inner join b on a.id = b.id 

MENO

 select distinct a.* from a left outer join b on a.id = b.id where b.id is null 

Se modifichi la domanda originale e pubblichi alcuni dati di esempio, è ansible fornire un esempio.

EDIT: Ho dimenticato di aggiungere il distinto alle domande.

INTERSECT NON è UN INTERESSE INTERNO. Sono diversi. Un INNER JOIN ti darà file duplicati nei casi in cui INTERSECT non lo farà. Puoi ottenere risultati equivalenti per:

 SELECT DISTINCT a.* FROM a INNER JOIN b on a.PK = b.PK 

Nota che PK deve essere la colonna o le colonne della chiave primaria. Se non c’è nessun PK sul tavolo (BAD!), Devi scriverlo in questo modo:

 SELECT DISTINCT a.* FROM a INNER JOIN b ON a.Col1 = b.Col1 AND a.Col2 = b.Col2 AND a.Col3 = b.Col3 ... 

Con MINUS, puoi fare la stessa cosa, ma con un LEFT JOIN, e una condizione WHERE che verifica il null su una delle colonne non nullable della tabella b (preferibilmente la chiave primaria).

 SELECT DISTINCT a.* FROM a LEFT JOIN b on a.PK = b.PK WHERE b.PK IS NULL 

Questo dovrebbe farlo.

Sono fatti tramite JOINs. Alla vecchia maniera 🙂

Per INTERSECT, puoi usare un JOINT INTERNO. Abbastanza diretto. È sufficiente utilizzare GROUP BY o DISTINCT se non si dispone di una relazione one-to-one pura in corso. Altrimenti, come altri hanno menzionato, puoi ottenere più risultati di quanto ti aspetteresti.

Per MINUS, puoi usare LEFT JOIN e usare WHERE per limitarlo, in modo da ottenere solo le righe dalla tabella principale che non hanno corrispondenza con la tabella LEFT JOINed.

Vai tranquillo.

Sfortunatamente MINUS non è supportato in MS Access: una soluzione alternativa sarebbe creare tre query, una con il set di dati completo, una che estrae le righe da filtrare e una terza che lasci le due tabelle e tiri solo i record che solo esiste nel set di dati completo.

La stessa cosa vale per INTERSECT, eccetto che lo faresti tramite un inner join e solo i record di ritorno che esistono in entrambi.