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


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





.

Respuesta Responder a este mensaje
#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:
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





.
Respuesta Responder a este mensaje
#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:%
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:
> 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
>>
>>
>>
>>
>>
>> .


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida