Oracle - Fila única para producto cartesiano

 
Vista:

Fila única para producto cartesiano

Publicado por Antonio (4 intervenciones) el 17/12/2008 11:23:42
Estoy intentando solucionar un problema ancestral (ORACLE 10g ) que planteo a continuación:

Pongamos una tabla de alumnos y otra de asignaturas con una relación 1:n. Al realizar una consulta sobre las asignaturas del alumno "juan" obtengo los siguiente resultados:

| Juan | Matematicas |
| Juan | Lengua |

¿Existe alguna forma en SQL (no PL/SQL) para obtener el siguiente resultado?

| Juan | Matematicas ; Lengua |

Es decir que el motor de base de datos reagrupe los multivalores de una consulta. En el manual de Oracle 10g no he encontrado nada pero entiendo que es una operación muy común y util por ejemplo a la hora de exportación de resultados en xls o texto plano.
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

RE:Fila única para producto cartesiano

Publicado por Mau (6 intervenciones) el 12/01/2009 21:17:27
Que tal Antonio, eso lo puedes resolver fácilmente con una función. Algo así:

CREATE OR REPLACE FUNCTION TEST(P_ID_VENDEDOR NUMBER)
RETURN VARCHAR2
IS

V_CLIENTES VARCHAR2(1000);

BEGIN
FOR R_CLI IN (SELECT NOMBRE_CLIENTE FROM CLIENTES WHERE ID_VENDEDOR = P_ID_VENDEDOR) LOOP
V_CLIENTES := V_CLIENTES || '/' || R_CLI.NOMBRE_CLIENTE;
END LOOP;
RETURN V_CLIENTES;
END;

Para que aplique a tu ejemplo, nada más sustituye los vendedores por los alumnos y los clientes por asignaturas.

Después podrías hacer una consulta muy simple:

SELECT NOMBRE_VENDEDOR,
TEST(ID_VENDEDOR)
FROM VENDEDORES
WHERE ID_VENDEDOR IN (16,22)

Y te devolvería algo así:

MIGUEL ANGEL BECERRIL /FERRECORRECAMINOS, S.A. DE C.V./CRAVIOTO Y ALQUICIRA VICTOR/COBRECENTRO, S.A. DE C.V.

MIREYA ROJAS /INDESIN, S.A. DE C.V./CONSTRUCCIONES INDUSTRIALES TAPIA, S.A. DE C.V./EQUIPOS Y CARROCERIAS AMERICA, S.A. DE C.V.

Espero haberte podido orientar algo. Saludos!
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

RE:Fila única para producto cartesiano

Publicado por Ntonio (4 intervenciones) el 13/01/2009 08:32:57
Muchas gracias Mauricio,

esta opción ya la he con templado el problema que tengo es que la estructura de datos que consulto es de 8 tablas con muchos regsitros cada una (10.000, 2.000, 25.000, etc..) por lo que el número de consultas que me planteas sería grandísimo.

Por otro lado parte de la información podría estar repetida por lo que eso también tengo que controlarlo por lo que al final he decidido en traerme todos los datos y tratarlos en JAVA mediante un método que los acople parametrizando los valores que actúan como identificadores.

Un saludo y gracias de nuevo.
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

RE:Fila única para producto cartesiano

Publicado por Sergio (79 intervenciones) el 04/03/2009 06:42:01
Amigo no tienes normalizada tu información. Necesitas una tabla intermedia donde tengas la relación ALUMNOS con ASIGNATURAS si en la tabla alumnos tienes una llave primaria, tienes que relacionarla con la llave primaria de ASIGNATURAS en otra tabla que pudieras bien llamar ALUMNO_ASIGNATURA y con esta relación puedes fácilmente obtener lo que quieres PIENSALO.
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

RE:Fila única para producto cartesiano

Publicado por aquintas (4 intervenciones) el 04/03/2009 09:54:37
Tienes toda la razón, quizás no me expliqué correctamente en el ejemplo, ya tengo esa tabla intermedia que es la que me da problema.

De todas formas lo he solucionado con la instrucción EXIST, una para cada asignatura.

Gracias de todas formas, aunque si conoces otra forma te lo agradecería.
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