Estoy tratando de comparar dos tablas, SQL Server, para verificar algunos datos. Quiero devolver todas las filas de ambas tablas donde los datos están en una u otra. En esencia, quiero mostrar todas las discrepancias. Necesito verificar tres datos al hacerlo, Nombre, Apellido y Producto.
Soy bastante nuevo en SQL y parece que muchas de las soluciones que estoy encontrando están complicando las cosas. No tengo que preocuparme por los NULL.
Empecé intentando algo como esto:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
Aunque tengo problemas para llevar esto más lejos.
¡Gracias!
EDITAR:
Según la respuesta de @treaschf, he estado tratando de usar una variación de la siguiente consulta:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Pero sigo obteniendo 0 resultados cuando sé que hay al menos 1 fila en td que no está en d.
EDITAR:
Ok, creo que lo descubrí. Al menos en mis pocos minutos de prueba parece funcionar lo suficientemente bien.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
Básicamente, esto me dirá qué hay en mis datos de prueba que no están en mis datos reales. Lo cual está completamente bien para lo que necesito hacer.
Respuestas:
SI tiene tablas
A
yB
, ambas con columnasC
, aquí están los registros, que están presentes en la tablaA
pero no enB
:Para obtener todas las diferencias con una sola consulta, se debe utilizar una combinación completa, como esta:
Lo que necesita saber en este caso es que, cuando se puede encontrar un registro en
A
, pero no enB
, que las columnas que provienenB
serán NULL, y de manera similar para las que están presentes enB
y no enA
, las columnas deA
will ser nulofuente
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Recibo un error si los nombres de las tablas son iguales y los extrae de dos bases de datos diferentes.a.dbo.student as
yb.dbo.student bs
luego consultar las tablas conas
ybs
fuente
SELECT *
funciona si este es el caso para todas las columnas; si no, solo seleccione algún subconjunto.Sé que esta puede no ser una respuesta popular, pero estoy de acuerdo con @Randy Minder en el uso de herramientas de terceros cuando se necesita una comparación más compleja.
Este caso específico aquí es fácil y para este caso estas herramientas no son necesarias, pero esto puede complicarse fácilmente si introduce más columnas, bases de datos en dos servidores, criterios de comparación más complejos y demás.
Existen muchas de estas herramientas, como ApexSQL Data Diff o Quest Toad, y siempre puede usarlas en modo de prueba para hacer el trabajo.
fuente
tablediff
utilidad de línea de comandos de SQL Server a la que se hace referencia aquí .Para obtener todas las diferencias entre dos tablas, puede usar como yo esta solicitud SQL:
fuente
Variación simple en la respuesta @erikkallen que muestra en qué tabla está presente la fila:
Si recibes un error
entonces puede ayudar agregar
fuente
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
con esta selección. Tuve que agregar la'table1' as source,
parte también a la parte Excepto. - Edité la respuesta para esto.Si desea obtener qué valores de columna son diferentes, puede usar el modelo Entity-Attribute-Value:
EJEMPLO DE FIDDLE DE SQL
fuente
Prueba esto :
Mucho más simple de leer.
fuente
Esto hará que el truco, similar a la solución de Tiago , devuelva también la tabla "fuente".
El resultado contendrá diferencias entre tablas, en la columna _tabloc tendrá una referencia de tabla.
fuente
Presentando el Cadillac de Diffs como un SP. Vea dentro la plantilla básica que se basó en la respuesta de @erikkallen. Es compatible
Uso:
Código:
fuente
Puede usar excepto, por ejemplo, algo como esto:
fuente
Para una simple prueba de humo en la que intenta asegurarse de que dos tablas coincidan sin preocuparse por los nombres de columna:
Puede escribir fácilmente un procedimiento de tienda para comparar un lote de tablas.
fuente
Hay un problema de rendimiento relacionado con la unión izquierda, así como la unión completa con datos de gran tamaño.
En mi opinión, esta es la mejor solución:
fuente