Determinar si dos tablas tienen los mismos datos

Imagina la situación de chequear si dos tablas o vistas tienen los mismos datos (en cantidad y valores). En ORACLE, esto no sería mayor inconveniente gracias al operador MINUS. MINUS devuelve aquellas filas que están en un primer ‘select’ y no están en un segundo ‘select’. Sin embargo ¿como podemos lograr esto con bases de datos SQL Server o MySQL?

Imagina que tenemos dos tablas o vistas, con los siguiente estructura o bien con los mismos campos en común:

mysql> DESCRIBE Products;

+--------------------+-------------+------+-----+---------+-------+
| Field              | Type        | Null | Key | Default | Extra |
+--------------------+-------------+------+-----+---------+-------+
| productCode        | varchar(15) | NO   | PRI | NULL    |       |
| productName        | varchar(70) | NO   |     | NULL    |       |
| buyPrice           | double      | NO   |     | NULL    |       |
+--------------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

-- Creamos una vista de la tabla, omitiendo algunos registros a propósito
CREATE VIEW Products2 AS SELECT productCode,productName,buyPrice FROM Products WHERE productName NOT LIKE '%Renault%'

La solución, para comparar las tablas (o vistas) consiste en utilizar NOT EXISTS y luego el operador UNION ALL con aquellas filas que no están en la primer tabla (o vista) y no así en la segunda, combinadas con las filas que están en la segunda tabla y no en la primera:

SELECT  *
FROM    (
    SELECT   productCode,productName,buyPrice,count(*) as c
    FROM        Products
    GROUP BY    productCode,productName,buyPrice
    ) A
WHERE   NOT EXISTS
    (
    SELECT   *
    FROM       (
            SELECT   productCode,productName,buyPrice,count(*) as c
            FROM        Products2
            GROUP BY    productCode,productName,buyPrice
            ) B
    WHERE   A.productCode = B.productCode
            and A.productName = B.productName
            and A.c = B.c
    )
UNION all
SELECT  *
FROM    (
    SELECT   productCode,productName,buyPrice,count(*) as c
    FROM        Products2
    GROUP BY    productCode,productName,buyPrice
    ) A
WHERE   NOT EXISTS
    (
    SELECT   *
    FROM       (
            SELECT   productCode,productName,buyPrice,count(*) as c
            FROM        Products
            GROUP BY    productCode,productName,buyPrice
            ) B
    WHERE   A.productCode = B.productCode
            and A.productName = B.productName
            and A.c = B.c
    )

Vía: Micro Codes

Deje su comentario

Por favor, ingrese su nombre

Por favor, ingrese un correo-e válido

Por favor, ingrese su mensaje

luauf.com 2012

WordPress