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 A
pero sé que table A
está 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.
select * from TableB b where b.ID not in (select a.ID from TableA a)
Select 1
significa retorno1
como 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 cambiar1
a todos los valores válidos (*, 1, 2, 3, columna1, columna2) y los resultados no cambiarán.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).
fuente
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 )
fuente
Esto también funciona
SELECT * FROM tableB WHERE ID NOT IN ( SELECT ID FROM tableA );
fuente
O si "NO EXISTE" no se implementa
SELECT * FROM B WHERE (SELECT count(*) FROM A WHERE A.ID = B.ID) < 1
fuente