Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Como hago una consulta para comparar dos tablas? (https://www.clubdelphi.com/foros/showthread.php?t=42478)

Nelly 15-04-2007 21:23:35

¿Como hago una consulta para comparar dos tablas?
 
Hola a todos!!!!!, Buen dia

Tengo un problema para realizar una consulta de comparación, entre dos tablas, para empezar utilizo firebird como BD, y lo que necesito es como dije anteriormente hacer una comparación, la cuestión es que tengo dos tablas, ambas con los mismo campos,pero se hizo una actualización hace unos meses en la tabla 1, y la tabla 2 no se toco, ahora quiero saber, que cantidad de registro aunmento en la tabla 1, y quienes son los de la tabla 1, que no se encuentren en la tabla 2, la estructura de la tabla es la siguiente:
Código SQL [-]
CREATE TABLE REGISTRO2007 (
    CVE_DTO      VARCHAR(2),
    SECCION      VARCHAR(4),
    LOCALIDAD    VARCHAR(4),
    MANZANA      VARCHAR(4),
    EDAD         VARCHAR(3),
    CALLE        VARCHAR(32),
    NO_EXT       VARCHAR(8),
    INTERIOR     VARCHAR(8),
    COLONIA      VARCHAR(32),
    CP           VARCHAR(5),
    ESTATUS      VARCHAR(50),
    NOM          VARCHAR(60),
    APPAT        VARCHAR(40),
    APMAT        VARCHAR(40),
    CVE_ELEC     VARCHAR(18) NOT NULL,
    CVE_MPO      INTEGER,
    CVE_EDO      SMALLINT

marcoszorrilla 15-04-2007 22:34:25

Para saber la diferencia numérica, utiliza un:

Código SQL [-]
Select (*) count from Tabla1
//y luego
Select (*) count from Tabla2

Esto te devolverá los registros que tiene cada tabla, la diferencia te dará el incremento que ha tenido la que se ha modificado.

Para saber los nuevos registros tendrías que comparar el campo clave de ambas tablas

Código SQL [-]
Select T1.CampoClave, T2.CampoClave
from Tabla1 as T1, Tabla2 as T2
Whre T1.CampoClave <> T2.CampoClave

Un Saludo.

Nelly 15-04-2007 23:04:50

Hay manera de ver solo los que se insertaron?, por ejemplo si se inserto 1000 personas, solo vea esas mil personas, porq esa consulta que escribiste, me enlista dos campos, que es la cve_elec, en la primera me muestra todos sin repetir, pero en la segunda columna esta repitiendo una sola clave.

hach 16-04-2007 02:20:18

Código SQL [-]
SELECT * FROM TABLA1 WHERE NOT EXISTS (SELECT * FROM TABLA2 WHERE TABLA1.CLAVE=TABLA2.CLAVE)

Esto te retorna los registros de la tabla1 que no existen en la tabla2
Creo que los paréntesis iban ahi, en esta maquina no tengo ninguna DB para probar

Nelly 16-04-2007 18:07:34

Buen dia!!!!!
Realice la siguiente consulta que se mando, pero no me esta arrojando el resultado correcto, ya que de la tabla 1, reste lo que tiene la tabla 2 y la diferencia entre ambas, no es la misma que arroja la consulta, es 3 veces de la cantidad real.

Código SQL [-]
SELECT pd.cve_elec,pd.appat,pd.apmat,pd.nom FROM padron1  pd WHERE NOT EXISTS (SELECT p.cve_elec,p.appat,p.apmat,p.nom FROM padron2
WHERE pd.cve_elec=p.cve_elec)

hach 16-04-2007 20:22:59

Suponiendo que la unica clave es cve_elec el SQL seria:
Código SQL [-]
SELECT pd.cve_elec, pd.appat, pd.apmat, pd.nom FROM padron1 pd WHERE NOT EXISTS (SELECT * FROM padron2 WHERE pd.cve_elec=cve_elec)
Debería funcionar...Si no es así, avisa que lo pruebo sobre una DB...Saludos

AzidRain 16-04-2007 21:56:25

Aqui tienes una "receta" de MySQL CookBook que puedes aplicar a FB


Tenemos dos tablas: artistas y pinturas.
Determinemos que qu artistas no se encuentran en la tabla pinturas. En este ejemplo las tablas son pequeñas asi que es facil determinar eso visualmente, podemos ver que no hay pinturas de Monet y Picaso (no hay registros en pinturas con un valor de a_id de 2 o 4)

Código SQL [-]
mysql> SELECT * FROM artist ORDER BY a_id;
Código:

+------+----------+
| a_id | name |
+------+----------+
| 1 | Da Vinci |
| 2 | Monet |
| 3 | Van Gogh |
| 4 | Picasso |
| 5 | Renoir |
+------+----------+


Código SQL [-]
SELECT * FROM painting ORDER BY a_id, p_id;
Código:

+------+------+-------------------+-------+-------+
| a_id | p_id | title | state | price |
+------+------+-------------------+-------+-------+
| 1 | 1 | The Last Supper | IN | 34 |
| 1 | 2 | The Mona Lisa | MI | 87 |
| 3 | 3 | Starry Night | KY | 48 |
| 3 | 4 | The Potato Eaters | KY | 67 |
| 3 | 5 | The Rocks | IA | 33 |
| 5 | 6 | Les Deux Soeurs | NE | 64 |
+------+------+-------------------+-------+-------+

Haciendo un left join asi
Supongamos que hacemos
Código SQL [-]
SELECT * FROM artist LEFT JOIN painting
   ON artist.a_id = painting.a_id;
Ejemplo:
Obtenemos una tabla de pinturas con sus artistas
Código:

+------+----------+------+------+-------------------+-------+-------+
| a_id | name | a_id | p_id | title | state | price |
+------+----------+------+------+-------------------+-------+-------+
| 1 | Da Vinci | 1 | 1 | The Last Supper | IN | 34 |
| 1 | Da Vinci | 1 | 2 | The Mona Lisa | MI | 87 |
| 2 | Monet | NULL | NULL | NULL | NULL | NULL |
| 3 | Van Gogh | 3 | 3 | Starry Night | KY | 48 |
| 3 | Van Gogh | 3 | 4 | The Potato Eaters | KY | 67 |
| 3 | Van Gogh | 3 | 5 | The Rocks | IA | 33 |
| 4 | Picasso | NULL | NULL | NULL | NULL | NULL |
| 5 | Renoir | 5 | 6 | Les Deux Soeurs | NE | 64 |
+------+----------+------+------+-------------------+-------+-------+

La tabla es similar a la que se obtiene con un join normal, solo que en este caso tambien produce una fila para cada artista que no tiene pinturas que correspondan en la tabla "pinturas". Por ello las columnas correspondientes a la tabla "pinturas" aparecen con nulos.

Ahora restringimos solo las columnas que no se encontraron y agregamos un
WHERE que busque solo los valores Nulos para la columna "pintura"

Código SQL [-]
SELECT * FROM artist LEFT JOIN painting
 ON artist.a_id = painting.a_id
WHERE painting.a_id IS NULL;
Código:

+------+---------+------+------+-------+-------+
| a_id | name | a_id | p_id | title | price |
+------+---------+------+------+-------+-------+
| 2 | Monet | NULL | NULL | NULL | NULL |
| 4 | Picasso | NULL | NULL | NULL | NULL |
+------+---------+------+------+-------+-------+

Finalmente para mosotrar solo los valores de la tabla artistas que no estan en la tabla pinturas, ordenamos las columnas para incluir solo las columnras de la tabla artistas


Código SQL [-]
mysql> SELECT artist.* FROM artist LEFT JOIN painting
-> ON artist.a_id = painting.a_id
-> WHERE painting.a_id IS NULL;
Código:

+------+---------+
| a_id | name |
+------+---------+
| 2 | Monet |
| 4 | Picasso |
+------+---------+

Lo mismo se aplica para el ejemplo que quieres hacer, saber que registros no se encuentran en otra tabla. Solo sigue l ejemplo, razónalo y veras que es sencillo


La franja horaria es GMT +2. Ahora son las 12:30:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi