Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Ayuda para una consulta sql

Estas en el tema de Ayuda para una consulta sql en el foro de Bases de Datos General en Foros del Web. Hola, no se como hacer una consulta relacionada con 2 tablas, supongo que se podrá hacer. Voy a poner un ejemplo básico de tablas: TablaPadre ...
  #1 (permalink)  
Antiguo 15/02/2008, 05:01
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 16 años, 6 meses
Puntos: 0
Ayuda para una consulta sql

Hola, no se como hacer una consulta relacionada con 2 tablas, supongo que se podrá hacer. Voy a poner un ejemplo básico de tablas:

TablaPadre
Id_Padre | NombreP
1 -------- Pepe
2 -------- Juan
3 -------- Manolo

TablaHijo
Id_Padre | NombreH
1 -------- Hijo1
1 -------- Hijo2
2 -------- Hijo1
2 -------- Hijo2
2 -------- Hijo3
3 -------- Hijo1
3 -------- Hijo2

Lo que quiero sacar es un listado que aparezca así:

NombreP | NombresH
Pepe ------- Hijo1, Hijo2
Juan ------- Hijo1, Hijo2, Hijo3
Manolo----- Hijo1, Hijo2

Me da igual, que estén los Hijos en columnas diferentes ó en la misma columna separada por comas.

Os agradecería que me pasarías la consulta en sql

Un saludo,
  #2 (permalink)  
Antiguo 15/02/2008, 05:48
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Ayuda para una consulta sql

¿Qué RDBMS estás usando? Sé como solucionar ésto en SQL Server 2000 ó 2005, pero para otros tendría que investigar.
  #3 (permalink)  
Antiguo 15/02/2008, 05:55
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Ayuda para una consulta sql

Utilizo Access. Espero que funcione tb. Gracias
  #4 (permalink)  
Antiguo 15/02/2008, 15:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Ayuda para una consulta sql

¿Podrías Beakdan comentarnos como lo harías con SQL Server?, ya que tengo un problema similar y me serviría.....y además tal vez le pueda ayudar a arprielo como una referencia.

Muchas Gracias!
  #5 (permalink)  
Antiguo 15/02/2008, 16:10
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Ayuda para una consulta sql

¿Esto no les sirve?
Código:
Select P.NombreP, H.NombreH
From TablaPadre P
Inner Join TablaHijo H
    On P.Id_Padre = H.Id_Padre
Si entendí mal me dicen...


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #6 (permalink)  
Antiguo 15/02/2008, 16:20
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Ayuda para una consulta sql

En este post iislas publicó una solución con SQL Server 2000. Basicamente se trata de crear una función que concatene la columna que te interesa de todas las filas en una sola cadena, y llamar a dicha función en el juego de resultados. SQL Server 2005 tiene facilidades para realizar esto sin crear la función.
En access se tiene que usar el mismo enfoque que con SQL server 2000. Primero hay que crear la función:
Código:
Public Function ConcatRows(Query As String, Optional Separador As String = ",") As String
    Dim rs As DAO.Recordset
    Dim result As String
    
    Set rs = CurrentDb().OpenRecordset(Query, dbOpenForwardOnly)
    
    Do While Not rs.EOF
        result = result & rs.Fields(0).Value & Separador
        rs.MoveNext
    Loop
    
    result = Left(result, Len(result) - Len(Separador))
    
    ConcatRows = result
End Function
Y ahora puedes llamar a la función de esta manera:
Código:
SELECT    NombreP,
        ConcatRows("SELECT NombreH FROM TablaHijo WHERE Id_Padre = " & Id_Padre) AS NombresH
FROM    TablaPadre;

Última edición por Beakdan; 16/02/2008 a las 12:29
  #7 (permalink)  
Antiguo 15/02/2008, 19:53
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Ayuda para una consulta sql

Hola y gracias por la ayuda,
No he llegado ha entender muy bien lo del final del "where Id_Padre = " & Id_Padre"
Por otro lado de la función, ¿tengo que cambiar algo ó se deja tal como está? y por ultimo, ¿la función la escribo debajo de la consulta en el editor sql de access?

saludos,
  #8 (permalink)  
Antiguo 16/02/2008, 11:51
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Ayuda para una consulta sql

Bueno, imagina que simplemente es un subquery aplanado. La función está así definida para que sea genérica. Así que simpre debes pasarle una consulta válida. Pero te interesa que los hijos correspondan al padre, por lo tanto las cadena en la función debe corresponder a la consulta que traería dichos registros. Al evaluarse para cada Id_Padre las consultas que se ejecutan en la función son:
Código:
SELECT NombreH FROM TablaHijo WHERE Id_Padre = 1
SELECT NombreH FROM TablaHijo WHERE Id_Padre = 2
SELECT NombreH FROM TablaHijo WHERE Id_Padre = 3
Y así sucesivamente. Como un subquery.
La función la creas en un módulo de VBA. Simplemente usa el menú Insert/Module y allí inserta el código.
  #9 (permalink)  
Antiguo 16/02/2008, 13:58
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Ayuda para una consulta sql

Si lo quieres concatenado, entonces en un procedimiento almacenado igual puedes hacer algo como esto...

Código:
Create Prcodeure Sp_ObtenerhijosPorPadre
(
    @IdPadre As Integer
)
As
    Create Table #Padres
    (
        IdPadre Integer,
        Nombre VarChar(50),
        Hijos VarChar(2000),
        Procesado Bit
    )

    Declare @IdPadre As Integer,
        @Hijos As VarChar(2000)

    Insert Into #Padres
        Select IdPadre, NombreP, '', 0
        From TablaPadres

    Select Top 1 @IdPadre = IdPadre
    From #Padres
    Where Procesado = 0

    While @IdPadre Is Not Null Begin
        --Recuperar a los hijos concatenados
        Set @hijos = ''

        Select @hijos = @hijos + NombreH
        From Tablahijo
        Where IdPadre = @IdPadre

        --Actualizamos los hijos encontrados a la tabla de padres
        Update #Padres
        Set Hijos = @Hijos,
            Procesado = 1
        Where IdPadre = @IdPadre

        --Reiniciar la variable @IdPadre
        Set @IdPadre = Null

        --Recuperar al siguiente padre
        Select Top 1 @IdPadre = IdPadre
        From #Padres
        Where Procesado = 0

    End

    --Desplegar el resultado obtenido
    Select IdPadre, Nombre, Hijos
    From #Padres

    --Destruir la temporal
    Drop Table #Padres

Go
Espero que te sirva!


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #10 (permalink)  
Antiguo 18/02/2008, 09:10
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Ayuda para una consulta sql

Es fabuloso, funciona!!! Gracias Beakdan y Gabo77
Al final me basto con la función "ConcatRows".
Aun me gustaría dar un paso más, ya lo he intentado yo pero no consigo hacerlo. Y es que a esa consulta se le pueda decir que muestre todos los padres solo con hijo3, es decir pepe y manolo no deberían de salir.
Lo he intentado, cambiando la consulta pero como es lógico la función me da un error, supongo que es por lo que me dices aquí
Cita:
Pero te interesa que los hijos correspondan al padre, por lo tanto las cadena en la función debe corresponder a la consulta que traería dichos registros.
Como estoy algo pez en VB no sabría por donde meterle mano. Haber si hay solución para esto, pero no obstante gracias por la ayuda.

Saludos,
  #11 (permalink)  
Antiguo 18/02/2008, 13:58
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Ayuda para una consulta sql

Que te muestre todos los padres con "Hijo3" pero ¿que siga concatenando todos sus hijos?
Código:
SELECT    p.NombreP,
        ConcatRows("SELECT NombreH FROM TablaHijo WHERE Id_Padre = " & p.Id_Padre) AS NombresH
FROM    TablaPadre AS p
INNER JOIN TablaHijo AS h
    ON p.Id_Padre = h.Id_Padre
WHERE    NombreH = "Hijo3";
  #12 (permalink)  
Antiguo 18/02/2008, 17:13
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Ayuda para una consulta sql

Cita:
Iniciado por Beakdan Ver Mensaje
Que te muestre todos los padres con "Hijo3" pero ¿que siga concatenando todos sus hijos?
Código:
SELECT    p.NombreP,
        ConcatRows("SELECT NombreH FROM TablaHijo WHERE Id_Padre = " & p.Id_Padre) AS NombresH
FROM    TablaPadre AS p
INNER JOIN TablaHijo AS h
    ON p.Id_Padre = h.Id_Padre
WHERE    NombreH = "Hijo3";

Beak... creo que para lo que el amigo necesita, el Where NombreH = 'Hijo3' debiera estar en la consulta que va dentro de la función ConcatRows... ahora... una pregunta, quieres que aparezca si y solo si es el hijo3? o te basta con que el que aparezca siempre sea el mayor?


saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #13 (permalink)  
Antiguo 18/02/2008, 17:23
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Ayuda para una consulta sql

Si pongo la condición dentro de la función, ésta pierde todo sentido ¿no crees? Puesto que al colocarla allí obtendría un único registro. Para eso es mejor no usarla y tomar la columna "NombreH" de la tabla "TablaHijo" en el Join.
Según lo que entendí, quiere concatenar todos los Nombres de los hijos de aquellos padres que tengan un hijo = "Hijo3". Para filtrar lo mejor es el Join, porque así excluye los Padres 1 y 3. Si pusiera la condición en la función, resulta obvio que seguiría teniendo en el resultado a los tres padres.
  #14 (permalink)  
Antiguo 18/02/2008, 17:33
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Ayuda para una consulta sql

Cita:
Iniciado por arprielo Ver Mensaje
Es fabuloso, funciona!!! Gracias Beakdan y Gabo77
Al final me basto con la función "ConcatRows".
Aun me gustaría dar un paso más, ya lo he intentado yo pero no consigo hacerlo. Y es que a esa consulta se le pueda decir que muestre todos los padres solo con hijo3, es decir pepe y manolo no deberían de salir.
Lo he intentado, cambiando la consulta pero como es lógico la función me da un error, supongo que es por lo que me dices aquí

Como estoy algo pez en VB no sabría por donde meterle mano. Haber si hay solución para esto, pero no obstante gracias por la ayuda.

Saludos,
Mi comentario va por lo que marque en negro.... por eso al final de mi comentario le comento lo siguiente: quieres que aparezca si y solo si es el hijo3? o te basta con que el que aparezca siempre sea el mayor? si es lo que requiere lo siguiente era recomendarle que la concatenación no tiene nada que hacer aqui.... jeje Saludos!


saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #15 (permalink)  
Antiguo 19/02/2008, 03:28
Avatar de arprielo  
Fecha de Ingreso: octubre-2007
Mensajes: 67
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Ayuda para una consulta sql

Agradeceros en todo momento el empeño puesto en la consulta.
El problema esta resuelto utilizando el JOIN. Sí, mi duda era esa, que apareciera solo Juan pero con todos los hijos como en un principio había planteado.
Yo, estube ya intentado eso, pero me falto poner en la consulta de la función ...WHERE Id_Padre = " & p.Id_Padre... la P, por eso no me funcionaba.

GRACIAS BEAKDAN,
GRACIAS GABO77
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 05:07.