2010-04-08 17 views
6

Durante la scrittura di viste e viste di nidificazione all'interno di viste più profonde a volte mi manca qualcosa e alla fine perdo righe/dati. Come posso verificare che le colonne di due diverse tabelle abbiano una corrispondenza esatta dei dati?Verificare che due colonne di due tabelle diverse corrispondano esattamente a

Esempio:

select count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2); 

Ciò restituire il numero di valori in table1.col1 che non sono in table2. Tuttavia, non so che questa è una buona soluzione in quanto non conta i valori table2.col1 che non esistono in table1.col1.

+0

Ovviamente le viste di nidificazione sono generalmente una cosa negativa (almeno in SQL Server). In fase di sviluppo può sembrare una cosa buona, ma una volta che hai finito di produrre e avere molti record, puoi far cadere il sistema nidificando le visualizzazioni. Mettevo alla prova quelle viste nidificate aggiungendo un milione di record di test alle tabelle di base. – HLGEM

+0

infatti, alla fine avrei riscritto le query, la creazione di una stringa di viste nidificate è a prova di concetto all'inizio per verificare che i dati siano modellati nel modo in cui lo voglio. Riforgerei le viste quando il database è in esecuzione. – galford13x

risposta

3

Usa:

SELECT MAX(x.t1_missing_count) AS t1_missing_count, 
     MAX(x.t2_missing_count) AS t2_missing_count 
    FROM (
SELECT COUNT(DISTINCT t1.col1) AS t1_missing_count, 
     NULL AS t2_missing_count 
    FROM TABLE_1 t1 
WHERE t1.col1 NOT IN (SELECT DISTINCT t2.col1 
         FROM TABLE_2 t2) 
UNION ALL 
SELECT NULL, 
     COUNT(DISTINCT t2.col1),   
    FROM TABLE_2 t2 
WHERE t2.col1 NOT IN (SELECT DISTINCT t1.col1 
         FROM TABLE_1 t1)) x 
+0

non sono sicuro del motivo per cui non ho pensato di usare UNION. Quindi lo prendo usando una clausola SUB NOT query è ok per un'operazione come questa? – galford13x

+0

@ galford13x: Non ho informazioni su quale delle tre - NON ESISTE, NON IN, e LEFT JOIN/IS NULL - è la più efficiente da usare in questo momento. –

0
declare @count int, @count2 int 


select @count = count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2) 

select @count2 = count(distinct table2.col1) 
    from table2 
where table2.col1 not in (select distinct table1.col1 
          from table1) 

select @count + @count2 
+0

Usando SQLite, posso usare variabili interne come MS SQL o MySQL? – galford13x

+0

Hmm, è stato ritoccato, penso di aver controllato il tipo Sql ... –

+0

Non penso che sia stato rinominato, ma è codificato SQL :) – galford13x

1
select count(*) from (

select 
table1.col1 from table1 left join table2 on table1.col1 = table2.col2 
where table2.col1 is null 

union 

select table2.col1 from table2 left join table 1 on table2.col1 = table1.col1 
where table1.col1 is null 

) 
6

è possibile utilizzare due EXCEPT query (o unione loro) per controllare:

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

che mostrerà i valori che esistono in tabella 1, ma non tabella2. Quindi esegui di nuovo i nomi dei tavoli capovolti per il contrario.

+0

Mi piace la semplicità. Lo avvolgo con un conteggio SELECT() per ottenere il numero di differenze. Grazie. – galford13x

Problemi correlati