2010-06-04 13 views
35

Tengo dos tablasseleccionar un valor en el que no existe en otra mesa

Tabla A:

ID 
1 
2 
3 
4 

Tabla B:

ID 
1 
2 
3 

tengo dos preguntas:

  • Quiero seleccionar todas las filas en la tabla A que la tabla B no tiene ve, que en este caso es la fila 4.
  • Quiero eliminar todas las filas que la tabla B no tiene.

estoy usando SQL Server 2000.

Respuesta

60

usted podría utilizar NOT IN:

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

Sin embargo, mientras tanto yo prefiero NOT EXISTS:

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

Hay otras opciones también, en este artículo se explican todas las ventajas y desventajas muy bien:

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

+0

Funciona muy bien, gracias –

+0

buen artículo! muchas gracias .. – Li3ro

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

o

select ID from A except select ID from B; 

su segunda pregunta:

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

Excepto que no está en SQL Server 2000. –

21

Para su primera cuestión, hay al menos tres métodos comunes para elegir:

  • NO EXISTE
  • NO EN
  • LEFT JOIN

El SQL tiene este aspecto:

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 

Dependiendo de la base de datos que está utilizando, el rendimiento de cada uno puede variar. Para SQL Server (columnas no anulables):

no existe y no en los predicados son la mejor manera de buscar los valores que faltan, siempre y cuando ambas columnas en cuestión no son 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

¿Es esta sintaxis válida? ¿No debería estar donde la identificación no está en (...)? – Behrang

+0

Esto no funcionará. La sintaxis correcta debería ser: 'SELECCIONE LA IDENTIFICACIÓN DESDE A DONDE ID NO ESTÁ (SELECCIONE ID FROM B);' – kamasheto

3

Este seleccionaría 4 en su caso

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

Esto eliminarlos

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

EXCEPTO no es parte de SQL Server 2000. –

0
SELECT ID 
    FROM A 
WHERE NOT EXISTS(SELECT 1 
        FROM B 
        WHERE B.ID = A.ID 
       ) 
Cuestiones relacionadas