SQL - Consulta sobre producto cartesiano

 
Vista:

Consulta sobre producto cartesiano

Publicado por McClane (3 intervenciones) el 24/11/2015 20:59:40
Hola,

Tengo que resolver un problema y os agradecería vuestra ayuda.

Tengo dos tablas, una de recursos y otra de solicitudes.
En la tabla de recursos hay dos columnas, ID y nombre, y en la tabla de solicitudes también.

Tengo los siguientes registros:
RECURSOS: ID, 1 NOMBRE, JOSE - ID, 2 NOMBRE JOSE
SOLICITUDES: ID, 98 NOMBRE, JOSE - ID, 99 NOMBRE JOSE

Obviamente, una select tal como:
select * from recursos r, solicitudes s where r.nombre = s.nombre;

Me devuelve algo como (el producto cartesiano):
1 JOSE 98 JOSE
1 JOSE 99 JOSE
2 JOSE 98 JOSE
2 JOSE 99 JOSE

Ahora viene el problema, quiero que el primer recurso JOSE se asigne a la primera solicitud JOSE y la segunda a la segunda, con el resultado:
1 JOSE 98 JOSE
2 JOSE 99 JOSE

¿Alguna idea de cómo hacerlo?

Mil gracias por adelantado,

Saludos.
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 Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta sobre producto cartesiano

Publicado por Isaias (1921 intervenciones) el 25/11/2015 00:12:03
¿No te sirve un MAX(ID) sobre solicitudes?
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

Consulta sobre producto cartesiano

Publicado por McClane (3 intervenciones) el 25/11/2015 12:20:41
Hola, gracias por el interés,
La verdad es que no veo la forma solo con un MAX, mira, pongo otro ejemplo un poco mas realista a ver si se entiende a lo que quiero llegar; hay una tabla de perfiles disponibles y otra de solicitudes de un recurso por perfil.

En la de perfiles, tienes como clave primaria cierto código, y como perfil, pues en este momento tienes a dos técnicos;
PERFILES_DISPONIBLES
-----------------------------
a1-TECNICO
b2-TECNICO

Ahora tienes una tabla de solicitudes de perfil, que igualmente tienen un código de clave primaria y tienen un perfil que solicitan. Los IDS de las claves primarias entre tablas NO TIENEN NADA QUE VER, puede ser cualquier cosa, letras, un código hash, cualquier cosa (no hay posible coincidencia dentro de la misma tabla obviamente) y también solicitan a dos técnicos (los que sean).

SOLICITUDES
------------------------------
c3-TECNICO
d4-TECNICO

Ok, ahora quiero hacer una select, que me devuelva una relación, por perfil disponible y perfil solicitado que me de como resultado :

RESULTADO_ESPERADO:
----------------------
a1-c3-TECNICO
b2-d4-TECNICO

ó (me es indiferente qué técnico se asigne a cada solicitud)

a1-d4-TECNICO
b2-c3-TECNICO


Se trata de asignar un UNICO recurso para cada solicitud, sin que haga el producto cartesiano, si haces una join por el PERFIL, el resultado sería:

RESULTADO_NO_DESEADO:
----------------------
a1-c3-TECNICO
b2-d4-TECNICO
a1-d4-TECNICO
b2-c3-TECNICO

Saludos y gracias
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

Consulta sobre producto cartesiano

Publicado por McClane (3 intervenciones) el 25/11/2015 16:31:08
Os paso como lo he resuelto, el count me sirve de control, la magia la hace el row_number():

1
2
3
4
5
6
7
8
9
10
select * from
(select at1.k1, at1.c2, ss1.c,
       row_number()over (partition by at1.c2 order by ss1.c) as vk1
       from at1,
            (select c2, count(2) as c from at1 group by c2) ss1 where at1.c2 = ss1.c2) ms1,
(select at2.k1, at2.c2, ss2.c,
       row_number()over (partition by at2.c2 order by ss2.c) as vk1
       from at2,
            (select c2, count(2) as c from at2 group by c2) ss2 where at2.c2 = ss2.c2)ms2
where ms1.c2 (+)= ms2.c2 and ms1.vk1 (+)= ms2.vk1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar