2010-04-08 10 views
6

Al escribir vistas y anidar vistas en vistas más profundas, a veces omito algo y termino perdiendo filas/datos. ¿Cómo puedo verificar que las columnas de dos tablas diferentes tengan una coincidencia exacta de datos?Verifique que dos columnas de dos tablas diferentes coincidan exactamente con

Ejemplo:

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

Esto devolver el número de valores en table1.col1 que no están en Tabla2. Sin embargo, no sé si esta es una buena solución ya que no cuenta los valores table2.col1 que no existen en table1.col1.

+0

Por supuesto, las vistas de anidamiento generalmente son malas (al menos en SQL Server). Puede parecer que está bien en desarrollo, pero una vez que vaya a prod y tenga muchos registros, puede derribar el sistema anidando vistas. Probaría esas vistas anidadas agregando unos cuantos millones de registros de prueba a las tablas base. – HLGEM

+0

de hecho, eventualmente volvería a escribir las consultas, la creación de una cadena de vistas anidadas es como una prueba de concepto al principio para verificar que los datos tengan la forma que yo quiero. Refactorizaría las vistas cuando se despliegue la base de datos. – galford13x

Respuesta

3

Uso:

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

no estoy seguro de por qué no pensé usar UNION. Entonces lo tomo usando una cláusula NOT IN. ¿La sub consulta es correcta para una operación como esta? – galford13x

+0

@ galford13x: No tengo información sobre cuál de los tres, NO EXISTE, NO EN, y LEFT JOIN/IS NULL, es el más eficiente para usar en este 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, ¿puedo usar variables internas como MS SQL o MySQL? – galford13x

+0

Hmm, fue esto re-etiquetado, creo que revisé el tipo Sql ... –

+0

No creo que haya sido reetiquetado, pero está etiquetado 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

Se pueden utilizar dos EXCEPT consultas (o cooperativa de ellos) para comprobar:

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

que mostrará los valores que existen en la tabla 1, pero no mesa2. Luego vuelva a ejecutar con los nombres de las tablas invertidos para el opuesto.

+0

Me gusta la simplicidad. Envuelvo esto con un conteo SELECCIONADO() para obtener el número de diferencias. Gracias. – galford13x

Cuestiones relacionadas