2010-04-08 7 views
6

Lors de l'écriture de vues et de l'imbrication de vues dans des vues plus profondes, il m'arrive parfois de manquer quelque chose et de perdre des lignes/données. Comment puis-je vérifier que les colonnes de deux tables différentes ont une correspondance exacte des données?Vérifiez que deux colonnes de deux tables différentes correspondent exactement

Exemple:

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

Cela retourne le nombre de valeurs dans table1.col1 qui ne sont pas table2. Cependant, je ne sais pas que c'est une bonne solution car elle ne compte pas les valeurs de table2.col1 qui n'existent pas dans table1.col1.

+0

Bien sûr, l'imbrication des vues est généralement une mauvaise chose (au moins dans SQL Server). Cela peut sembler bien en développement, mais une fois que vous allez à prod et que vous avez beaucoup d'enregistrements, vous pouvez réduire le système en imbriquant des vues. Je testerais ces vues imbriquées en ajoutant un million d'enregistrements de test aux tables de base. – HLGEM

+0

en effet, je voudrais réécrire finalement les requêtes, la création d'une chaîne de vues imbriquées est pour preuve de concept au début pour vérifier que les données sont en forme comme je le veux. Je refactoriser les vues lorsque la base de données est déployée. – galford13x

Répondre

3

Utilisation:

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

pas sûr pourquoi je ne pensais pas à utiliser UNION. Donc, je le prends en utilisant une sous-requête clause NOT IN est ok pour une opération comme celle-ci? – galford13x

+0

@ galford13x: Je n'ai pas d'information sur laquelle des trois - NOT EXISTS, NOT IN, et LEFT JOIN/IS NULL - est la plus efficace à utiliser en ce moment. –

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

En utilisant SQLite, puis-je utiliser des variables internes comme MS SQL ou MySQL? – galford13x

+0

Hmm, était-ce marqué de nouveau, je pense que j'ai vérifié pour le type Sql ... –

+0

Je ne pense pas qu'il a été re-étiqueté, mais il est étiqueté 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

Vous pouvez utiliser deux EXCEPT requêtes (ou l'union entre eux) pour vérifier:

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

Cela montrera des valeurs qui existent dans le tableau 1, mais pas table2. Ensuite, exécutez à nouveau avec les noms de table retournés pour le contraire.

+0

J'aime la simplicité. J'emballe avec un compte SELECT() pour obtenir le nombre de différences. Merci. – galford13x

Questions connexes