Dudas sobre la conexión entre dos consultas en una aplicación creada con lenguaje SQL

Hola,¿cómo puedo realizar una consulta que me diga si el resultado de una consulta está contenido en otro?
Una select me dice las características de una entidad, y otra me devuelve las características de otra, y yo necesito saber si el primer grupo de características contiene al segundo.
Es urgente.
Muchas gracias
Respuesta
1
Creo que la solución, si entendí bien lo que quieres, es sencilla.
Se puede usar el resultado de un select como elemento de comparación en una cláusua where.
Veamos un ejemplito.
Tengo dos tablas una de empleados con una clave primaria numero_empleado. Y otra tabla de sueldos de empleado de cada mes
Bien, imaginate que yo quiero saber los nombres de los empleados que han cobrado en el mes de enero más de 1000 dolares... pues haría así
SELECT NUM_EMPLEADO,NOMBRE
FROM EMPLEADO
WHERE NUM_EMPLEADO IN
(SELECT NUM_EMPLEADO
FROM SUELDOS
WHERE MES='ENERO'
AND IMPORTE_SUELDO>1000);
El IN es si my subquery, que así se llama lo que creo que necesitas, devuelve más de una fila, si solo devolviese una pondríamos = en lugar del IN.
De todas formas, yo casi nunca uso el IN a no ser que no me quede más remedio, en su lugar intenta hacer un JOIN entre las dos tablas
Suerte y que seas feliz.
Pablo
Te pongo un ejemplo->
Supongamos una tabla con una serie de registros y con esta estructura
ID_GRUPO VALOR
1 X
1 Y
2 X
2 Y
2 Z
3 X
3 Z
Y otra tabla de Personas con la siguiente información
Persona grupo
YO 1
TU 2
Mi amigo 3
Mi amiga 1
Entonces tenemos 3 grupos cada uno con unos valores, si YO soy del grupo 1, y TÚ del grupo 2, tus características envuelven a las mías, pero si mi amigo es del grupo 3, sus características no envuelven a las mías, es decir, necesito mediante sentencias SQL sacar todas aquellas personas que sus características envuelvan a las mías, en este caso debería devolverme TU y MI AMIGA.
Espero haber aclarado las cosas.
Un saludo,
Inma
Veamos... no entiendo el concepto "las características que envuelven a las características", es decir,
porque según tu ejemplo,
"si YO soy del grupo 1, y TÚ del grupo 2, tus características envuelven a las mías"
Pero
"si mi amigo es del grupo 3, sus características no envuelven a las mías"
¿Qué es lo que hace que unas características envuelvan o no a las características de otra persona? ¿Dónde está esto reflejado en las tablas?... no lo veo.. y es que es muy temprano
Pero no desesperes que lo sacaremos Inma
Empezamos de nuevo
Tenemos 3 tablas, una de grupos de características, otra de características y otra de personas, ¿vale?
Tabla Características, contiene los siguientes datos:
X
Y
Z
Tabla Grupos de Características contienes los siguientes datos(cada fila es un registro de la tabla)
GRUPO1 -> X
GRUPO1 -> Y
GRUPO2 -> X
GRUPO2 -> Y
GRUPO2 -> Z
GRUPO3 -> Y
GRUPO3 -> Z
¿Vale? Bueno no se si me he explicado, el grupo1 lo forman las características X y Y, el grupo2 lo forman las características X, Y y Z y el grupo3 las características Y y Z
Bueno pues ahora tenemos personas, las personas tienen asociadas un grupo de características, por ejemplo:
YO -> Grupo1
TU -> Grupo2
EL -> Grupo3
Y nos inventamos una nueva tabla para poder ver todo esto mejor, la tabla Trabajos, que también asocia un Trabajo con un grupo de características
Trabajo1 -> Grupo1
Trabajo2 -> Grupo2
Entonces lo que yo necesito saber son aquellas personas que pueden realizar cada trabajo.
Suponemos tenemos selecciona el Trabajo1, me debería devolver Que las personas YO y TU, pueden realizar ese trabajo puestos que sus características engloban las características del trabajo, pero nunca debería devolverme EL, puesto que aunque una de sus características coincide con las características del trabajo1, no engloba todas las características de este.
No se si me he vuelto a explicar, pero espero que te haya quedado un poco más claro...
No puedo utilizar PL/SQL solo sentencias SELECT de SQL
Muchas gracias
Pero que exigencias, que si son que horas o que horas.. que cada uno se despierta cuando le dejan o cuando puede.. ¿no? Je je
Creo que ya me ha quedado un poco más claro
He dibujado un poco la estructura de tus tablas y veo alguna deficiencia de normalización, pero no voy a entrar en ella pues me parece que es sólo un ejemplo.
Creo que la solución más simple es que uses JOIN.
Es decir que unas todas las tablas. En este caso la de trabajo con grupo. La unión hazla por clave primaria..
Quieres que salgan todas las personas que estén en el grupo que incluya todas las características que tienen el grupo al que pertenece un determinado trabajo.. ¿no?
Lo difícil de aquí creo que es conseguir que personas de grupos distintos al del grupo de trabajo salgan, lo que sería el caso de personas del grupo 2, en el ejemplo... Quizás habría que hacer dos selects una para que te salgan las personas que tienen en la tabla personas el grupo de trabajo y otra para personas que tengan un grupo en el que TODAS sus características estén incluidas en las del grupo del trabajo que buscas
La primera sería así
SELECT NOMBRE
FROM PERSONA P, TRABAJO T
WHERE T.IDTRABAJO = 'T1'
AND P.ID_GRUPO =T.ID_GRUPO
La segunda sería algo así
SELECT NOMBRE
FROM PERSONA P, GRUPO G, TRABAJO T
WHERE T.IDTRABAJO='T1'
AND G.ID_GRUPO <> T.ID_GRUPO
AND 0=(SELECT COUNT(*)
FROM GRUPO G2
WHERE G2.CARACTER = G.CARACTE
AND G2.ID_GRUPO=T.ID_GRUPO)
AND P.ID_GRUPO = G.ID_GRUPO
La parte del 0= () nos dice que mire si hay características que no tiene el grupo que estamos consultando, solo cogeremos grupos que tengan todas las características del grupo que consultamos que ha de ser distinto al que nos da la tabla de trabajo (para conseguir el grupo 2)
Luego para conseguir los resultados de ambas querys usa un UNION
Es un poco lioso, pero puede funcionar, igual he metido la pata en algún igual .. pero la mejor forma de hacerlo es directamente contra las tablas y probando y probando..
Si tuviese aquí las tabla y el modelo de datos, te daría la query total..
Suerte
Pablo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas