Domanda

Ho un problema simile a questa domanda StackOverflow , se non che io necessità di escludere determinati campi dal confronto, ma ancora includerlo nel set di risultati.
Sto scrivendo il problema come differenza a livello locale simmetrica.

Per esempio tabella A e B hanno le colonne X, Y, Z e voglio confrontare solo Y, Z per le differenze, ma voglio ancora il set di risultati per includere X.

È stato utile?

Soluzione

Anziana SQL per un full join - A concatenato con B, escluse le righe in B anche in A (al centro):

-- 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 Stile:

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

I di Coalesce sono lì per la sicurezza; Non ho mai avuto motivo di scrivere un full outer join nel mondo reale.

Se si vuole veramente sapere se due tavoli sono identici, ecco come:

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)

Se che restituisce un risultato diverso da zero, allora c'è una differenza. E non ti dice quale tabella si trova, ma è un inizio.

Altri suggerimenti

Sembra che questo è fondamentalmente ciò che si desidera. Corrispondenti righe tra due tabelle su colonne Y e Z, trovare le righe abbinate, ed emettere i valori delle colonne X, Y, e 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top