Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Como creo una consulta que borre clientes sin ordenes

Estas en el tema de Como creo una consulta que borre clientes sin ordenes en el foro de SQL Server en Foros del Web. Estimados, tengo un problemita como puedo crear una consulta que borre solo un cliente que no tenga obras con ordenes. Dejo una imagen de las ...
  #1 (permalink)  
Antiguo 09/07/2009, 20:45
Avatar de BlueSkull  
Fecha de Ingreso: noviembre-2008
Ubicación: Chile
Mensajes: 504
Antigüedad: 15 años, 5 meses
Puntos: 4
Como creo una consulta que borre clientes sin ordenes

Estimados, tengo un problemita como puedo crear una consulta que borre solo un cliente que no tenga obras con ordenes. Dejo una imagen de las tablas.

Espero que me puedan ayudar, gracias.
Adios.
__________________
"Incluso las torres más altas empiezan en el suelo."
"Sé Ágil..."
StreamWriter
  #2 (permalink)  
Antiguo 10/07/2009, 01:50
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 15 años
Puntos: 7
Respuesta: Como creo una consulta que borre clientes sin ordenes

Prueba con esta sentencia:

DELETE FROM cliente WHERE rut not in(
select c.rut from cliente c
join obra o on o.rut=c.rut
join orden od on od.idobra=o.idobra)

Lo hice a simple vista, ya que no tuve tiempo para hacer la prueba, solo me guie de la imagen de tus tablas, espero te ayude o te de una pista..

Suerte
  #3 (permalink)  
Antiguo 10/07/2009, 07:54
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Como creo una consulta que borre clientes sin ordenes

Seria mas optimo usar NOT EXISTS en lugar de NOT IN.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #4 (permalink)  
Antiguo 11/07/2009, 22:08
Avatar de BlueSkull  
Fecha de Ingreso: noviembre-2008
Ubicación: Chile
Mensajes: 504
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: Como creo una consulta que borre clientes sin ordenes

Estimados, gracias por la ayuda, alfcm me funciono para borrar los clientes que no tienen obras, pero no para borrar los clientes que tienen obras pero no ordenes, como quedaria la consulta para esto ultimo?.

flaviovich por que es mas optimo el EXISTS que el IN?.

Gracias, adios.
__________________
"Incluso las torres más altas empiezan en el suelo."
"Sé Ágil..."
StreamWriter
  #5 (permalink)  
Antiguo 11/07/2009, 23:19
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Como creo una consulta que borre clientes sin ordenes

Si el SELECT que esta dentro del IN devuelve miles de registros imagina cuantas comparaciones se realizaran por cada registro, en cambio el EXIST solo busca un registro de acuerdo al JOIN que se haga.
Haz la comparacion y nos dices cual es mas rapido.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 13/07/2009, 21:59
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Como creo una consulta que borre clientes sin ordenes

Seria algo mas o menos asi

SELECT a.PK FROM TABLA1 t1 WHERE EXISTS(SELECT * FROM TABL2 t2 WHERE t1.pk = t2.pk)
  #7 (permalink)  
Antiguo 14/07/2009, 16:51
Avatar de BlueSkull  
Fecha de Ingreso: noviembre-2008
Ubicación: Chile
Mensajes: 504
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: Como creo una consulta que borre clientes sin ordenes

Estimados, gracias por la ayuda pero tengo un problemita, al final mi consulta para probra que me traiga los clientes que no tiene obras y clientes que tienen obras pero que no tengan ordenes me funciona bien y es la siguiente:

Código:
SELECT CLIENTE.RUT 
FROM CLIENTE
WHERE CLIENTE.RUT NOT IN(
SELECT DISTINCT OBRA.RUT 
	FROM CLIENTE INNER JOIN OBRA 
		ON CLIENTE.RUT = OBRA.RUT INNER JOIN ORDEN 
		ON OBRA.IDOBRA = ORDEN.IDOBRA)
Pero la idea es poder borrar los clientes que no tengan obras y clientes que tengan obras pero que no tengan ordenes y la consulta me quedo asi:

Código:
DELETE
FROM CLIENTE
WHERE CLIENTE.RUT NOT IN(
SELECT DISTINCT OBRA.RUT 
	FROM CLIENTE INNER JOIN OBRA 
		ON CLIENTE.RUT = OBRA.RUT INNER JOIN ORDEN 
		ON OBRA.IDOBRA = ORDEN.IDOBRA)
La cual me funciona y borra los clientes de la tabla cliente que no tienen obras en la tabla obra, pero no me funciona para borrar los clientes que tienen obras sin ordenes. Como puedo completar esta consulta para que aparte de borrar el cliente me borre las obras que no tienen ordenes.

Gracias, adios.

PD1: Las tablas.
PD2: flaviovich no puedo hacer funcionar el EXISTS o NOT EXISTS en la consulta.
Código:
SELECT CLIENTE.RUT 
FROM CLIENTE
WHERE CLIENTE.RUT NOT EXISTS(
SELECT DISTINCT OBRA.RUT 
	FROM CLIENTE INNER JOIN OBRA 
		ON CLIENTE.RUT = OBRA.RUT INNER JOIN ORDEN 
		ON OBRA.IDOBRA = ORDEN.IDOBRA)
__________________
"Incluso las torres más altas empiezan en el suelo."
"Sé Ágil..."
StreamWriter
  #8 (permalink)  
Antiguo 14/07/2009, 20:24
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Como creo una consulta que borre clientes sin ordenes

Compañero, se te aconsejo el uso del EXISTS (NOT).

SELECT CLIENTE.RUT
FROM CLIENTE
WHERE CLIENTE.RUT a NOT EXISTS(SELECT *
FROM ORDEN WHERE
CLIENTE.RUT = OBRA.RUT)
ON OBRA.IDOBRA = ORDEN.IDOBRA)
  #9 (permalink)  
Antiguo 14/07/2009, 22:00
Avatar de BlueSkull  
Fecha de Ingreso: noviembre-2008
Ubicación: Chile
Mensajes: 504
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: Como creo una consulta que borre clientes sin ordenes

Cita:
Iniciado por iislas Ver Mensaje
Compañero, se te aconsejo el uso del EXISTS (NOT).

SELECT CLIENTE.RUT
FROM CLIENTE
WHERE CLIENTE.RUT a NOT EXISTS(SELECT *
FROM ORDEN WHERE
CLIENTE.RUT = OBRA.RUT)
ON OBRA.IDOBRA = ORDEN.IDOBRA)
Estimado no puedo hacer funcionar el EXISTS (NOT) como le comentaba a flaviovich, a que se refiere el "a" que pones en la consulta?.

Gracias.
__________________
"Incluso las torres más altas empiezan en el suelo."
"Sé Ágil..."
StreamWriter
  #10 (permalink)  
Antiguo 15/07/2009, 07:44
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Como creo una consulta que borre clientes sin ordenes

Asi sería:
Código sql:
Ver original
  1. DELETE FROM CLIENTE
  2. WHERE NOT EXISTS(
  3.     SELECT *
  4.     FROM OBRA O
  5.     INNER JOIN ORDEN R ON O.IDOBRA = R.IDOBRA
  6.     WHERE CLIENTE.RUT = O.RUT
  7. )
Para borrar las ordenes tienes que hacer otro delete.
Suerte!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #11 (permalink)  
Antiguo 16/07/2009, 10:41
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Como creo una consulta que borre clientes sin ordenes

Bueno.............sin mas comentarios.............gracias flaviovich por tu esfuerzo y dedicacion......
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:18.