Select varios valores en tabla secundaria.

03/10/2006 - 17:19 por Marianoh | Informe spam
Hola grupo:

Tengo dos tablas relacionadas, Proyectos y Personas, la relación es 1
a n.
Yo quiero obtener todos los proyectos donde estuvieron la Sra.'Gómez'
y 'García'
El resultado lo obtengo con la siguinte consulta:

SELECT ID
FROM PROYECTOS
WHERE
PROYECTOS.ID IN
(SELECT PROYECTOS.ID
FROM PROYECTOS
INNER JOIN PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
WHERE PERSONAS.APELLIDO_1 = 'GOMEZ'
AND PERSONAS.SEXO='F')
AND PROYECTOS.ID IN
(SELECT PROYECTOS.ID
FROM PROYECTOS
INNER JOIN PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
WHERE PERSONAS.APELLIDO_1 = 'GARCIA')

El tema es que como la lista de nombres puede extenderse
considerablemente y esto forma parte de una consulta mayor quisiera
saber si hay una mejor manera de obtener el resultado.

Saludos: Mariano

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
03/10/2006 - 17:36 | Informe spam
Trata:

SELECT
PROYECTOS.ID
FROM
dbo.PROYECTOS
INNER JOIN
dbo.PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
where
(
PERSONAS.APELLIDO_1 = 'GOMEZ'
or PERSONAS.APELLIDO_1 = 'GARCIA'
)
AND PERSONAS.SEXO='F'
group by
PROYECTOS.ID
having
count(distinct case when (PERSONAS.APELLIDO_1 = 'GOMEZ' or
PERSONAS.APELLIDO_1 = 'GARCIA') AND PERSONAS.SEXO='F' then
PERSONAS.APELLIDO_1 end) = 2
go

Compara los planes de ejecucion, asi como las estadisticas de lectura de
ambas sentencias.


AMB

"Marianoh" wrote:

Hola grupo:

Tengo dos tablas relacionadas, Proyectos y Personas, la relación es 1
a n.
Yo quiero obtener todos los proyectos donde estuvieron la Sra.'Gómez'
y 'García'
El resultado lo obtengo con la siguinte consulta:

SELECT ID
FROM PROYECTOS
WHERE
PROYECTOS.ID IN
(SELECT PROYECTOS.ID
FROM PROYECTOS
INNER JOIN PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
WHERE PERSONAS.APELLIDO_1 = 'GOMEZ'
AND PERSONAS.SEXO='F')
AND PROYECTOS.ID IN
(SELECT PROYECTOS.ID
FROM PROYECTOS
INNER JOIN PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
WHERE PERSONAS.APELLIDO_1 = 'GARCIA')

El tema es que como la lista de nombres puede extenderse
considerablemente y esto forma parte de una consulta mayor quisiera
saber si hay una mejor manera de obtener el resultado.

Saludos: Mariano


Respuesta Responder a este mensaje
#2 Alejandro Mesa
03/10/2006 - 18:54 | Informe spam
Corrección:

SELECT
PROYECTOS.ID
FROM
dbo.PROYECTOS
INNER JOIN
dbo.PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
where
(
PERSONAS.APELLIDO_1 = 'GOMEZ'
or PERSONAS.APELLIDO_1 = 'GARCIA'
)
AND PERSONAS.SEXO='F'
group by
PROYECTOS.ID
having
count(distinct PERSONAS.APELLIDO_1) = 2
go


AMB


"Alejandro Mesa" wrote:

Trata:

SELECT
PROYECTOS.ID
FROM
dbo.PROYECTOS
INNER JOIN
dbo.PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
where
(
PERSONAS.APELLIDO_1 = 'GOMEZ'
or PERSONAS.APELLIDO_1 = 'GARCIA'
)
AND PERSONAS.SEXO='F'
group by
PROYECTOS.ID
having
count(distinct case when (PERSONAS.APELLIDO_1 = 'GOMEZ' or
PERSONAS.APELLIDO_1 = 'GARCIA') AND PERSONAS.SEXO='F' then
PERSONAS.APELLIDO_1 end) = 2
go

Compara los planes de ejecucion, asi como las estadisticas de lectura de
ambas sentencias.


AMB

"Marianoh" wrote:

> Hola grupo:
>
> Tengo dos tablas relacionadas, Proyectos y Personas, la relación es 1
> a n.
> Yo quiero obtener todos los proyectos donde estuvieron la Sra.'Gómez'
> y 'García'
> El resultado lo obtengo con la siguinte consulta:
>
> SELECT ID
> FROM PROYECTOS
> WHERE
> PROYECTOS.ID IN
> (SELECT PROYECTOS.ID
> FROM PROYECTOS
> INNER JOIN PERSONAS
> ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
> WHERE PERSONAS.APELLIDO_1 = 'GOMEZ'
> AND PERSONAS.SEXO='F')
> AND PROYECTOS.ID IN
> (SELECT PROYECTOS.ID
> FROM PROYECTOS
> INNER JOIN PERSONAS
> ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
> WHERE PERSONAS.APELLIDO_1 = 'GARCIA')
>
> El tema es que como la lista de nombres puede extenderse
> considerablemente y esto forma parte de una consulta mayor quisiera
> saber si hay una mejor manera de obtener el resultado.
>
> Saludos: Mariano
>
>
Respuesta Responder a este mensaje
#3 Marianoh
03/10/2006 - 19:27 | Informe spam
Alejandro: Gracias por responder.

La consulta no me trae datos.

Lo que no entiendo es como se especifica que la persona con sexo 'F' es
Gomez y no García.

Saludos
Respuesta Responder a este mensaje
#4 Alejandro Mesa
04/10/2006 - 16:46 | Informe spam
Marianoh,

Cometi un error, pense que ambas personas eran sexo 'F'.

SELECT
PROYECTOS.ID
FROM
dbo.PROYECTOS
INNER JOIN
dbo.PERSONAS
ON PROYECTOS.ID = PERSONAS.ID_PROYECTOS
where
(PERSONAS.APELLIDO_1 = 'GOMEZ' AND PERSONAS.SEXO='F')
or PERSONAS.APELLIDO_1 = 'GARCIA'
group by
PROYECTOS.ID
having
count(distinct PERSONAS.APELLIDO_1) = 2
go


AMB

"Marianoh" wrote:

Alejandro: Gracias por responder.

La consulta no me trae datos.

Lo que no entiendo es como se especifica que la persona con sexo 'F' es
Gomez y no García.

Saludos


Respuesta Responder a este mensaje
#5 Marianoh
05/10/2006 - 23:27 | Informe spam
Alejandro, nuevamente gracias por contestar.

La consulta ahora funciona, el único problema es que si hay dos
García y ningún Gómez los proyectos machean igual.

Igualmente me sirvió de puntapié para resolver el problema, la
solución es un poco más compleja porque hay condiciones que no
nombre, como que un criterio puede ser APELLIDO García y otro puede
ser NOMBRE Clara, pero el usuario puede estar buscando 2 personas
distintas incluidas en el mismo proyecto.

Ahora, si hay una persona llamada Clara García necesito que la
consulta no retorne nada excepto que aparte haya otra Clara u otro
García. Simpático no?

Bueno, despues de darle vuelta la solución parece ser:

SELECT DISTINCT ID_PROYECTOS FROM
(
(
SELECT ID_PROYECTOS, ID, '1' AS NroCriterio
FROM PERSONAS
WHERE (PERSONAS.APELLIDO_1 = 'GOMEZ'
AND PERSONAS.SEXO='F')
)
UNION
(
SELECT ID_PROYECTOS, ID, '3' AS NroCriterio
FROM PERSONAS
WHERE PERSONAS.APELLIDO_1 = 'GARCIA'
)
UNION
(
SELECT ID_PROYECTOS, ID, '2' AS NroCriterio
FROM PERSONAS
WHERE PERSONAS.nombre_1 = 'CLARA'
)
) AS T
GROUP BY ID_PROYECTOS
HAVING count (DISTINCT NroCriterio) >= 3
AND count (DISTINCT ID) = 3

Bueno, falta probarlo bien pero en fin, si no funciona aviso.

Saludos y gracias nuevamente a Alejandro.

Marianoh
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida