Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Seleccionar registros de una tabla que no existen en 2 tablas (https://www.clubdelphi.com/foros/showthread.php?t=92946)

andres_89 25-03-2018 22:09:55

Seleccionar registros de una tabla que no existen en 2 tablas
 
Buen día amigos,

Tengo un problema con una consulta sql, tengo 3 tablas (clientes, clientes_puntuales y clientes_antiguos), en la tabla "clientes" tengo todos los clientes, de los cuales algunos de ellos estan en "clientes_puntuales" y en "clientes_antiguos" a la vez.

Lo que requiero es obtener todos los registros de "clientes" que no esten en "clientes_puntuales" y en "clientes_antiguos", pero no logró armar dicho query, dejo mi query realizado:

Código SQL [-]
SELECT nombre FROM clientes 
WHERE NOT EXISTS (SELECT * FROM  clientes_puntuales WHERE clientes.nombre = clientes_puntuales.nombre)  
UNION 
SELECT nombre FROM clientes 
WHERE NOT EXISTS (SELECT * FROM  clientes_antiguos WHERE clientes.nombre = clientes_antiguos.nombre)

Lo que me devuelve la consulta son todos los registros de ambas tablas, y solo quiero obtener los registros de "clientes" que no estan en ambas tablas, ejemplo:

Tengo 3 registros en mi tabla "cliente" = (juan, marco, daniel)
Tengo 2 registros en mi tabla "cliente_puntuales" = (juan, marco)
Tengo 2 registros en mi tabla "cliente_antiguos" = (juan, marco)

y deseo obtener en este caso los registros de "clientes" que no estan en ambas tablas ("cliente_puntuales" y "cliente_antiguos") que es (daniel).
Espero puedan ayudarme, se los agradezco de antemano.
Saludos.

andres_89 25-03-2018 22:11:04

Seleccionar registros de una tabla que no existen en 2 tablas
 
Estoy utilizando Mysql.

TOPX 25-03-2018 22:34:00

Buen día,
Código SQL [-]
SELECT clientes.nombre 
FROM clientes 
  LEFT OUTER JOIN clientes_puntuales 
    ON clientes.nombre = clientes_puntuales.nombre
  LEFT OUTER JOIN clientes_antiguos 
    ON clientes.nombre = clientes_antiguos.nombre
WHERE clientes_puntuales.nombre IS NULL
  AND clientes_antiguos.nombre IS NULL
-

andres_89 25-03-2018 23:34:42

Cita:

Empezado por TOPX (Mensaje 525268)
Buen día,
Código SQL [-]SELECT clientes.nombre FROM clientes LEFT OUTER JOIN clientes_puntuales ON clientes.nombre = clientes_puntuales.nombre LEFT OUTER JOIN clientes_antiguos ON clientes.nombre = clientes_antiguos.nombre WHERE clientes_puntuales.nombre IS NULL AND clientes_antiguos.nombre IS NULL

-

Hola TOPX,

Me sale un error de sintaxis que "falta operador".
saludos.

yusnerqui 26-03-2018 01:25:20

Pues lo acabo de probar y funciona perfecto con solo copiarlo y pegarlo, revisa si lo estás poniendo en un procedimiento almacenado o algo pq la query está correcta.

Saludos.

andres_89 26-03-2018 02:50:57

Cita:

Empezado por yusnerqui (Mensaje 525272)
Pues lo acabo de probar y funciona perfecto con solo copiarlo y pegarlo, revisa si lo estás poniendo en un procedimiento almacenado o algo pq la query está correcta.

Saludos.

Hola , si, ya lo probe, funciona bien, era error mío al tipearlo, gracias TOPX.
Saludos.

ElDioni 26-03-2018 15:25:34

De todas formas te digo que también lo puedes hacer como lo estabas planteando en un principio, con exists, lo único que tu consulta yo la dejaría de esta forma.

Código SQL [-]
SELECT nombre FROM clientes  
WHERE NOT EXISTS (SELECT nombre FROM  clientes_puntuales WHERE clientes.nombre = clientes_puntuales.nombre)   
AND NOT EXISTS (SELECT nombre FROM  clientes_antiguos WHERE clientes.nombre = clientes_antiguos.nombre)

Saludos.

yusnerqui 29-03-2018 04:06:02

Cita:

Empezado por ElDioni (Mensaje 525280)
De todas formas te digo que también lo puedes hacer como lo estabas planteando en un principio, con exists, lo único que tu consulta yo la dejaría de esta forma.
Saludos.


Pues me gustaría que explicara por qué la dejaría así, ya que del modo que planteas, usando sub consultas tienes que esperar que se creen las dos tablas resultados para después comparar y generar la tabla resultado principal, de lo contrario, usando los inner join la comparación se realiza al tiempo que se está generando la consulta principal, por lo que en este caso particular debería tener mejor rendimiento.

Saludos.

ElDioni 11-06-2018 12:52:27

No me había dado cuenta de tu pregunta yusnerqui.


En realidad no me refería a que fuera la mejor opción, solo que, en caso de que lo quisiera plantear con exist hacerle saber que se puede pero que, yo lo dejaría de la forma que le puse.


Saludos.


La franja horaria es GMT +2. Ahora son las 22:57:24.

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