2010-06-04 47 views
35

Ho due tabelleselezionare un valore in cui non esiste in un'altra tabella

Tabella A:

ID 
1 
2 
3 
4 

Tabella B:

ID 
1 
2 
3 

ho due richieste:

  • Voglio selezionare tutte le righe nella tabella A che la tabella B non ha ve, che in questo caso è la riga 4.
  • Voglio eliminare tutte le righe che la tabella B non ha.

Sto usando SQL Server 2000.

risposta

60

si potrebbe usare NOT IN:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B) 

Tuttavia, nel frattempo preferisco NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID) 

Ci sono anche altre opzioni, questo articolo spiega tutti i vantaggi e gli svantaggi molto bene:

Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?

+0

Funziona alla grande, grazie –

+0

bell'articolo! molte grazie .. – Li3ro

1
select ID from A where ID not in (select ID from B); 

o

select ID from A except select ID from B; 

tua seconda domanda:

delete from A where ID not in (select ID from B); 
+1

Tranne che non è in SQL Server 2000. –

21

Per la vostra prima domanda ci sono almeno tre metodi comuni tra cui scegliere:

  • NON ESISTE
  • NOT IN
  • LEFT JOIN

Lo SQL simile al seguente:

SELECT * FROM TableA WHERE NOT EXISTS (
    SELECT NULL 
    FROM TableB 
    WHERE TableB.ID = TableA.ID 
) 

SELECT * FROM TableA WHERE ID NOT IN (
    SELECT ID FROM TableB 
) 

SELECT TableA.* FROM TableA 
LEFT JOIN TableB 
ON TableA.ID = TableB.ID 
WHERE TableB.ID IS NULL 

A seconda di quale database in uso, le prestazioni di ciascuno può variare. Per SQL Server (colonne non nullable):

non esiste e non IN predicati sono il modo migliore per la ricerca di valori mancanti, a patto che entrambe le colonne in questione non sono NULL.

-1
SELECT ID 
    FROM A 
WHERE ID NOT IN (
     SELECT ID 
     FROM B); 

SELECT ID  
    FROM A a 
WHERE NOT EXISTS (
     SELECT 1 
     FROM B b 
     WHERE b.ID = a.ID) 

  SELECT a.ID 
      FROM A a  
LEFT OUTER JOIN B b 
      ON a.ID = b.ID  
      WHERE b.ID IS NULL 

DELETE 
    FROM A 
WHERE ID NOT IN (
     SELECT ID 
     FROM B) 
+0

Questa sintassi è valida? Non dovrebbe essere dove ID non in (...)? – Behrang

+0

Questo non funzionerà. La sintassi corretta dovrebbe essere: 'SELECT ID FROM A WHERE ID NOT IN (SELEZIONA ID DA B);' – kamasheto

3

Ciò selezionare 4 nel tuo caso

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB) 

Questo sarebbe eliminarli

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB) 
+1

EXCEPT non fa parte di SQL Server 2000. –

0
SELECT ID 
    FROM A 
WHERE NOT EXISTS(SELECT 1 
        FROM B 
        WHERE B.ID = A.ID 
       ) 
Problemi correlati