Pregunta

Tengo un problema similar al esta cuestión StackOverflow , excepto que necesidad de excluir a ciertos campos de la comparación, pero todavía incluirlo en el conjunto de resultados.
Estoy escribiendo el problema, ya que la diferencia simétrica localmente.

Por ejemplo la Tabla A y B tienen columnas X, Y, Z y I quieren comparar solamente Y, Z para las diferencias pero todavía quieren que el conjunto de resultados para incluir X.

¿Fue útil?

Solución

SQL del viejo estilo por un total unirse - Un concatena con B, con exclusión de las filas de B también en un (medio):

-- all rows in A with or without matching B
select a.x, a.y, a.z 
  from a
       left join b
         on a.x = b.x
        and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
  from b
 where not exists (select null
                     from a
                    where b.x = a.x
                      and b.y = a.y)

ANSI Estilo:

select coalesce(a.x, b.x) as x,
       coalesce(a.y, b.y) as y,
       a.z
  from a 
       full outer join b
         on a.x = b.x
        and a.y = b.y

Los de COALESCE están allí para la seguridad; En realidad nunca he tenido motivo para escribir una combinación externa completa en el mundo real.

Si lo que realmente quiere averiguar si dos mesas son idénticos, así es como:

SELECT COUNT(*) 
  FROM (SELECT list_of_columns
          FROM one_of_the_tables
         MINUS
        SELECT list_of_columns
          FROM the_other_table
        UNION ALL
        SELECT list_of_columns
          FROM the_other_table
         MINUS
        SELECT list_of_columns
          FROM one_of_the_tables)

Si que devuelve un resultado distinto de cero, entonces hay una diferencia. Que no le dice qué tabla que se encuentra, pero es un comienzo.

Otros consejos

Sonidos como esto es básicamente lo que quiere. Coincidir filas entre dos tablas en las columnas Y y Z, buscar las filas no coincidentes, e imprimir los valores de las columnas de X, Y, y Z.

SELECT a.x, a.y, a.z, b.x, b.y, b.z
  FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
  WHERE a.y IS NULL OR b.y IS NULL
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top