Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta ¿compleja? (https://www.clubdelphi.com/foros/showthread.php?t=52196)

salvica 13-01-2008 17:48:31

Consulta ¿compleja?
 
Sé que el título no se ajusta a las normas, pero no encontré uno mas apropiado :mad:

Tengo un problema con una consulta para sacar todos los propietarios que tienen inmuebles de un tipo determinado

Código:

Tabla: PROPIETARIO (datos de los propietarios de inmuebles)
============================================================
ID_PROPIETARIO ---> clave del propietario
... -------> otros datos del propietario

Tabla: PROPIEDAD  (datos de los inmuebles)
============================================================
ID_PROPIEDAD -----> clave del inmueble
TIPO_PROPIEDAD ---> puede ser VIVIENDA, GARAJE, OFICINA, etc.
... -------> otros datos del inmueble

Tabla: PERTENECE (correspondencia entre los propetarios y sus inmuebles)
============================================================
ID_PERTENECE -----> identificador del registro
ID_PROPIETARIO ---> clave del propietario
ID_PROPIEDAD -----> clave del inmueble

Con esto saco los datos de TODOS los propietarios
Código SQL [-]
SELECT propietario.ID_PROPIETARIO, propietario.NOMBRE, propietario.APELLIDO_1, propietario.APELLIDO_2
  FROM propietario

Con esto saco los identificadores de los propietarios que tienen propiedades de un tipo determinado
Código Delphi [-]
{ pongo delphi porque no se porque no pilla la etiqueta sql }
SELECT DISTINCT pertenece.ID_PROPIETARIO
  FROM propiedad INNER JOIN pertenece ON propiedad.ID_PROPIEDAD = pertenece.ID_PROPIEDAD
 WHERE propiedad.TIPO="VIVIENDA"

He intentado lo siguiente (aparte de hacer el "canelo") :p
Código SQL [-]
SELECT propietario.NOMBRE, propietario.APELLIDO_1, propietario.APELLIDO_2,
       propietario.ID_PROPIETARIO IN (
                   SELECT DISTINCT pertenece.ID_PROPIETARIO
                     FROM propiedad INNER JOIN pertenece ON propiedad.ID_PROPIEDAD = pertenece.ID_PROPIEDAD
                    WHERE propiedad.TIPO="VIVIENDA"
       ) AS IDENTIFICADOR
  FROM propietario
pero no me vale, saca TODOS los propietarios y rellena IDENTIFICADOR con cero y menos uno (estos son los que tienen dichas propiedades) :mad:

¿como hago para que saque solo éstos últimos?
Agradecido por la ayuda
salvica

edito: ------> uso Zeos como conector y las tablas son .DBF
De nuevo agradecido
salvica

Delphius 13-01-2008 18:13:58

Hola salvica,
Creo haber entendido lo que deseas.

No estoy completamente despierto, ando medio dormido... disculpa... Por ahora me falla el cerebro al intentar hacer un SQL con el inner join. La técnica "pobre" es emplear WHERES... Por ahora el SQL que mi cerebro está consiguiendo es este:
Código SQL [-]
select Propietario.ID, Propietario.Nombre, ...
from Propieatio, Propiedad, Pertenece
where (Propietario.ID = Pertenece.ID_propietario) AND (Pertenece.ID_propiedad = Propiedad.ID) AND (Propiedad.Tipo = "VIVIENDA")

Si logro despestarme e inspirarme un poco es posible que logre obtener un SQL con inner joins anidados (que sería la mejor opción).

EDITO:
Creo que el SQL puede ser así:

Código SQL [-]
select ...
from Propietario inner join Pertenece (inner join Propiedad on Pertenece.ID_propiedad = Propiedad.ID) on Propietario.ID = Pertenece.ID_propietario
where Propiedad.Tipo = "VIVIENDA"

Saludos,

salvica 13-01-2008 18:30:34

Hola Delphius, gracias por responder ;)

Depues de muchas vueltas había llegado a esta solución:
Código Delphi [-]
SELECT propietario.ID_CLAVE, 
       propietario.NOMBRE, propietario.APELLIDO_1, propietario.APELLIDO_2, 
       propiedad.TIPO, propiedad.ID_CLAVE
  FROM pertenece, propietario, propiedad
 WHERE (pertenece.ID_PROPIEDAD IN (SELECT propiedad.ID_PROPIEDAD FROM propiedad))
   AND (pertenece.ID_PROPIETARIO=propietario.ID_CLAVE)
   AND (pertenece.ID_PROPIEDAD=propiedad.ID_CLAVE)
   AND (propiedad.TIPO="VIVIENDA")
 ORDER BY propietario.NOMBRE, propietario.APELLIDO_1, propietario.APELLIDO_2
que es bastante parecida a la tuya, la cual probaré ahora mismo :p

Gracias por todo
salvica

salvica 13-01-2008 18:51:47

Tema cerrado
 
Muchísimas gracias Delphius y quitando un problema de posición de peréntesis ;) se ejecuta muy rápida
Código Delphi [-]
SELECT propietario.ID_PROPIETARIO, 
       propietario.NOMBRE, propietario.APELLIDO_1, propietario.APELLIDO_2, 
       propiedad.TIPO, propiedad.ID_DIRECCION
  FROM propietario INNER JOIN (pertenece INNER JOIN (propiedad) ON pertenece.ID_PROPIEDAD = propiedad.ID_PROPIEDAD) ON propietario.ID_PROPIETARIO = pertenece.ID_PROPIETARIO
 WHERE propiedad.Tipo = "VIVIENDA"
Hasta otra
salvica

Delphius 13-01-2008 20:03:09

Me alegro de que funcionara.
Como dije... no estoy del todo despierto...

Saludos,


La franja horaria es GMT +2. Ahora son las 12:17:45.

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