SQL - select where not exists anidado con select a varias tablas

 
Vista:

select where not exists anidado con select a varias tablas

Publicado por Carla Gomez (3 intervenciones) el 04/12/2021 16:50:51
Hola,

Necesito ver con un select clientes que no tienen relación con otras tablas.

Esto es lo que hago con proveedores por ejemplo:

select * from PROVEEDORES where not exists (select * from COMPRAS where PROVEEDORES.CODIGO=COMPRAS.PROVEEDOR

Esto me muestra los proveedores a los que no le hemos hecho compras, que no tienen relacion con la tabla COMPRAS

El problema es con la tabla CLIENTES, ya que, los clientes pueden tener relacion con varias tablas a la vez COMPRAS, VENTAS, PRESUPUESTOS, ETC

Y no consigo sacarlo

¿Se puede hacer? ¿Como?

GRACIAS a tod@s
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 150
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

select where not exists anidado con select a varias tablas

Publicado por Francisco (62 intervenciones) el 06/12/2021 23:21:04
Hola

Lo puedes hacer usando UNION ALL y un CTE

1
2
3
4
5
6
7
8
WITH t_clientes AS (
  SELECT * FROM CLIENTES C WHERE cliente_id NOT IN (SELECT cliente_ID FROM COMPRAS WHERE cliente_id = C.cliente_id)
  UNION ALL
  SELECT * FROM CLIENTES C WHERE cliente_id NOT IN (SELECT cliente_ID FROM VENTAS WHERE cliente_id = C.cliente_id)
  UNION ALL
  SELECT * FROM CLIENTES C WHERE cliente_id NOT IN (SELECT cliente_ID FROM PRESUPUESTOS WHERE cliente_id = C.cliente_id)
)
SELECT DISTINCT * FROM t_clientes;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

select where not exists anidado con select a varias tablas

Publicado por Carla Gomez (3 intervenciones) el 07/12/2021 02:05:48
Hola Francisco,

Gracias por contestar, he probado y no funciona, me devuelve casi 5000 clientes y es imposible esa cantidad de clientes inactivos.

He probado esto:

1
2
3
4
5
6
7
8
9
10
WITH PRUEBA AS (
  SELECT * FROM CLIENTES WHERE CLIENTES.CODIGO NOT IN (SELECT REPARACIONES.CLIENTE FROM REPARACIONES WHERE REPARACIONES.CLIENTE = CLIENTES.CODIGO)
  UNION ALL
  SELECT * FROM CLIENTES WHERE CLIENTES.CODIGO NOT IN (SELECT VENTAS.CLIENTE FROM VENTAS WHERE VENTAS.CLIENTE = CLIENTES.CODIGO)
  UNION ALL
  SELECT * FROM CLIENTES WHERE CLIENTES.CODIGO NOT IN (SELECT PRESUPUESTOS.CLIENTE FROM PRESUPUESTOS WHERE PRESUPUESTOS.CLIENTE = CLIENTES.CODIGO)
  UNION ALL
  SELECT * FROM CLIENTES WHERE CLIENTES.CODIGO NOT IN (SELECT SERVICE_A_DOMICILIO.CLIENTE FROM SERVICE_A_DOMICILIO WHERE SERVICE_A_DOMICILIO.CLIENTE = CLIENTES.CODIGO)
)
SELECT DISTINCT * FROM PRUEBA;

Puede que tenga el error delante y no lo vea, pero...


Antes de preguntar en el foro, habia probado algo así:

1
2
3
select distinct VENTAS.CLIENTE from VENTAS
union
select distinct REPARACIONES.CLIENTE from REPARACIONES
etc...

y así con todas las tablas, con esto consigo ver todos los clientes que tienen registros con su CODIGO de cliente en las tablas de ventas, presupuestos, etc... pero no veo como ver lo contrario, los que no tienen ningun registro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

select where not exists anidado con select a varias tablas

Publicado por gilman (103 intervenciones) el 07/12/2021 10:39:26
Prueba:
1
2
3
select * from clientes
WHERE not exists (select 1 from compras where clientes.codigo = compras.cliente)
and not EXISTS (select 1 from ventas where clientes.codigo = ventas.cliente)
añadiendo un AND NOT EXISTS por cada tabla que necesites.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

select where not exists anidado con select a varias tablas

Publicado por Carla Gomez (3 intervenciones) el 07/12/2021 10:52:33
GRACIAS gilman

No sabia que se podian usar AND NOT EXISTS, como si fuese un AND solo. No se me habia ocurrido probrar

PERO FUNCIONA!!!

Muchas gracias a los dos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar