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

