Sentecia SQL

09/07/2004 - 13:20 por Elena | Informe spam
Hola Grupo,
tengo dos tablas una padre y una hija (relación 1:N)
habría alguna manera de hacer que en una sentencia me devuelva los registros
de la siguiente manera:

Padre Hija

padre1 NULL
NULL hijo1
NULL hijo2
NULL hijo3
padre2 NULL
NULL hijo1
NULL hijo2


Gracias de antemano...

Un saludo

Preguntas similare

Leer las respuestas

#1 ulises
09/07/2004 - 15:10 | Informe spam
Hola Elena,

Dadas las siguientes tablas participantes :

create table padre ( codigo_padre int primary key,
nombre_padre varchar(20) )
create table hijo ( codigo_hijo int primary key,
codigo_padre int,
nombre_hijo varchar(20) )
insert into padre values ( 1, 'Padre 1' )
insert into padre values ( 2, 'Padre 2' )
insert into hijo values ( 1, 1, 'Hijo 1-1' )
insert into hijo values ( 2, 1, 'Hijo 1-2' )
insert into hijo values ( 3, 1, 'Hijo 1-3' )
insert into hijo values ( 4, 2, 'Hijo 2-1' )
insert into hijo values ( 5, 2, 'Hijo 2-2' )

si hacemos :

select codigo_padre, nombre_hijo
from hijo
union
select distinct codigo_padre,null
from hijo

obtendremos :

codigo_padre nombre_hijo
1 NULL
1 Hijo 1-1
1 Hijo 1-2
1 Hijo 1-3
2 NULL
2 Hijo 2-1
2 Hijo 2-2

(7 row(s) affected)

que es parte de la consulta que deseamos, si a esta tabla
resultante le agregamos un join con la table padre :

select nombre_padre, nombre_hijo
from padre join ( select codigo_padre, nombre_hijo
from hijo
union
select distinct codigo_padre,null
from hijo ) hijos
on ( padre.codigo_padre = hijos.codigo_padre )
order by nombre_padre

obtendremos casi casi lo que deseamos :

nombre_padre nombre_hijo
Padre 1 NULL
Padre 1 Hijo 1-1
Padre 1 Hijo 1-2
Padre 1 Hijo 1-3
Padre 2 NULL
Padre 2 Hijo 2-1
Padre 2 Hijo 2-2

(7 row(s) affected)

para eliminar los nombres del padre repetido podriamos
usar el truco de identificar las columnas de detalle y
usarlas en un CASE para eliminarlas, algo como :

select ( case when tipo = 'P'
then nombre_padre
else null END) as padre,
nombre_hijo
from padre join ( select codigo_padre,
nombre_hijo,
'H' as tipo
from hijo
union
select distinct codigo_padre,
null,
'P' as tipo
from hijo ) hijos
on ( padre.codigo_padre = hijos.codigo_padre )
order by nombre_padre

y el resultado es el que deseamos :

padre nombre_hijo
Padre 1 NULL
NULL Hijo 1-1
NULL Hijo 1-2
NULL Hijo 1-3
Padre 2 NULL
NULL Hijo 2-1
NULL Hijo 2-2

(7 row(s) affected)

Saludos,
Ulises


Mostrar la cita
devuelva los registros
Mostrar la cita
#2 Javier Loria
09/07/2004 - 17:49 | Informe spam
Hola:
Una alternativa, usando el esquema de Ulises:
SELECT Padre
, Hijo
FROM (SELECT NULL AS Padre
, Nombre_Hijo AS Hijo
, Codigo_Padre AS CodigoP
, Codigo_Hijo AS CodigoH
FROM Hijo
UNION ALL
SELECT Nombre_Padre
, NULL
, Codigo_padre
, -1
FROM Padre) AS Todos
ORDER BY CodigoP, CodigoH
== Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
ulises escribio:
Mostrar la cita
#3 Elena
12/07/2004 - 09:44 | Informe spam
me ha sido de gran ayuda

gracias a los dos..

"Javier Loria" escribió en el mensaje
news:%
Mostrar la cita
Ads by Google
Search Busqueda sugerida