valores - operador like sql
T-SQL: ComparaciĆ³n de dos tablas: registros que no existen en la segunda tabla (7)
Si UNION ALL
es una adición en T-SQL. ¿Cuál es el equivalente de la resta?
Por ejemplo, si tengo una tabla PEOPLE
y una tabla EMPLOYEES
. Y sé que si EMPLOYEES
registros de EMPLOYEES
de PEOPLE
, quedaré con mis empresas CONTRACTORS
.
¿Hay alguna forma de hacer esto que sea similar a UNION ALL
? ¿Uno en el que no tengo que especificar ningún nombre de campo? La razón por la que pregunto es que este es solo un ejemplo hipotético. Necesito hacer esto varias veces en muchas tablas diferentes. Supongamos que el esquema de EMPLOYEES
y PEOPLE
es el mismo.
En lugar de usar UNION, use EXCEPT, (o INTERSECT para obtener solo registros en ambos) como se describe en
Lamentablemente, hay un problema en su diseño. en lugar de tener dos personas de la mesa y el CONTRATISTA. Debería tener una tabla PEOPLE y otra Table TYPE (si algunas personas pueden tener varios roles, quizás se necesite otra tabla). En su tabla PEOPLE usted hace una referencia a la tabla TYPE.
entonces tus peticiones se vuelven
SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id
AND TYPE.name = ''CONTRACTOR''
SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id
AND TYPE.name = ''EMPLOYEE''
(no probado)
Puede usar el operador EXCEPT para restar un conjunto de otro. Aquí hay una muestra de código que usa EMPLEADOS y PERSONAS tablas temporales. Necesitarás usar los nombres de campo con el operador EXCEPTT hasta donde yo sé.
CREATE TABLE #PEOPLE
(ID INTEGER,
Name NVARCHAR(50))
CREATE TABLE #EMPLOYEE
(ID INTEGER,
Name NVARCHAR(50))
GO
INSERT #PEOPLE VALUES (1, ''Bob'')
INSERT #PEOPLE VALUES (2, ''Steve'')
INSERT #PEOPLE VALUES (3, ''Jim'')
INSERT #EMPLOYEE VALUES (1, ''Bob'')
GO
SELECT ID, Name
FROM #PEOPLE
EXCEPT
SELECT ID, Name
FROM #EMPLOYEE
GO
La consulta final devolverá las dos filas en la tabla PEOPLE que no existen en la tabla EMPLOYEE.
SELECT
P.*
FROM
People P
LEFT OUTER JOIN Employees E ON
E.ID = P.ID -- Or whatever your PK-FK relationship is
WHERE
E.ID IS NULL
Para SQL Server, esta será probablemente la forma más efectiva de hacerlo.
SELECT * FROM Table1
WHERE Table1.Key NOT IN (SELECT Table2.Key FROM Table2 WHERE Table2.Key IS NOT NULL)
Se agregó IS NOT NULL para hacer felices a la gente.
Estoy de acuerdo con Tom. Su versión es probablemente más eficiente. La única razón posible para usar la mía, podría ser que es más bonita.
Descubrí que es mucho más fácil usar una herramienta como SQLMerger para hacer esto por usted. Los resultados se muestran de una manera más agradable y puede continuar con lo que necesite hacer con los datos a partir de entonces fácilmente.
www.auisoft.com/SQLMerger <= la herramienta que facilita la comparación de datos
ejemplo al comparar dos tablas: http://auisoft.com/SQLMerger/How-to/visualize-differences-in-2-databases/
Cuando comparo tablas buscando datos que no están en uno que está en el otro, normalmente utilizo SQL Division.
select *(or selected matching field)
from tableA as A
where not exist
(select *(or selected matching field)
from tableB as B
where A.key = B.key)
Esta consulta devolverá los resultados que están en la tabla A que no están en el proceso de división.
select *(or selected matching field)
from tableA as A
where exist
(select *(or selected matching field)
from tableB as B
where A.key = B.key)
Esta consulta devolverá todas las filas de datos que coinciden en ambas tablas, por lo tanto, si hay una fila de datos que está en la tabla A que no está en la tabla B, esa fila de datos no se recuperará.