sql: verifique si la entrada en la tabla A existe en la tabla B

80

Tengo una tabla de definición que sé que no se está manteniendo muy bien, llamemos a esto table A. Tengo otra tabla (llámala table B) que es mucho más pequeña e idealmente debería ser una, subset of table Apero sé que table Aestá algo obsoleta y no contiene nuevas entradas que estén en formato Table B.

Tenga en cuenta que las tablas A y B tienen columnas diferentes.

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

Quiero todas las filas en la Tabla B de manera que el ID en la Tabla B NO exista en la Tabla A. Esto no solo coincide con las filas en la Tabla A; Solo quiero filas en la Tabla B donde la ID NO existe en absoluto en la Tabla A.

codificación
fuente

Respuestas:

172
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)
gdoron está apoyando a Monica
fuente
@ algotr8der, me alegro de poder ayudar. Buen día.
gdoron apoya a Monica
10
select * from TableB b where b.ID not in (select a.ID from TableA a)
vakio
2
@vakio Gracias por la consulta. Definitivamente deberías poner tu comentario como respuesta.
Analytical Monk
@AnalyticalMonk Espero que sepa que es exactamente la misma consulta que produce exactamente los mismos resultados. Solo una sintaxis ligeramente diferente, eso es todo
gdoron está apoyando a Monica
2
@ManosKounelakis Select 1significa retorno 1como resultado de cada fila. A menudo se usa para señalar que los resultados no importan, pero la existencia por sí sola es lo que importa. Puede cambiar 1a todos los valores válidos (*, 1, 2, 3, columna1, columna2) y los resultados no cambiarán.
gdoron apoya a Monica
28

La respuesta clásica que funciona en casi todos los entornos es

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

a veces NO EXISTE puede no estar implementado (no funciona).

Danylo Zherebetskyy
fuente
¡Gracias, eso ayudó mucho!
lenach87
esta consulta es más eficiente que SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID = B.ID)
teteArg
El DUAL es una tabla especial de una fila y una columna presente por defecto en todas las bases de datos de Oracle. El propietario de DUAL es SYS (SYS es propietario del diccionario de datos, por lo tanto, DUAL es parte del diccionario de datos), pero todos los usuarios pueden acceder a DUAL. La tabla tiene una sola columna VARCHAR2 (1) llamada DUMMY que tiene un valor de 'X'. MySQL permite especificar DUAL como una tabla en consultas que no necesitan datos de ninguna tabla. En SQL Server, la tabla DUAL no existe, pero puede crear una.
David Kariuki
14

Si está configurado para usar EXISTS, puede usar lo siguiente en SQL Server:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)
Abe Miessler
fuente
3

Esto también funciona

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);
Kai Dong
fuente
0

O si "NO EXISTE" no se implementa

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
Daflanck
fuente