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
 

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


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 similares