none
expandir registro RRS feed

  • Pergunta

  • seguinte, tenho os dados de um prédio, nessa tabela tenho a quantidade de salas, quero fazer outra tabela com as salas.

    então, na primeira tabela eu tenho prédio 1, 20 salas, na tabela 2 quero prédio 1, sala 1, sala 2, sala 3....até 20, pq preciso inserir coisas em cada sala...como faço? procedure ou função? não sei fazer....alguém me ajuda? nunca fiz esse tipo de coisa...

    quinta-feira, 26 de janeiro de 2017 19:47

Respostas

  • Fiz com Recursividade , da uma olhada nesse exemplo, 

    CREATE TABLE Predios 
            (
              IdPredio INT NOT NULL  PRIMARY KEY ,
              QuantidadeSala INT
            );
    
    INSERT Predios
            ( IdPredio, QuantidadeSala )
    VALUES  ( 1, -- IdPredio - int
              20  -- QuantidadeSala - int
              );
    
    
    
    CREATE TABLE Salas
           (
             IdSala INT PRIMARY KEY ,
             IdPredio INT NOT NULL
                          FOREIGN KEY REFERENCES dbo.Predios ( IdPredio ) ,
             NomeSala VARCHAR(MAX),
           );
    
    WITH    Recursividade
              AS ( SELECT   IdPredio = P.IdPredio ,
                            IdSala = 1 ,
                            NomeSala = CONCAT('Sala-', 1)
                   FROM     dbo.Predios AS P
                   UNION ALL
                   SELECT   IdPredio = RS.IdPredio ,
                            IdSala = RS.IdSala + 1 ,
                            NomeSala = CONCAT('Sala-', RS.IdSala + 1)
                   FROM     Recursividade AS RS
                   WHERE    RS.IdSala < 20
                 )
         INSERT INTO dbo.Salas
                ( IdPredio ,
                  IdSala ,
                  NomeSala
                )
                SELECT  R.IdPredio ,
                        R.IdSala ,
                        R.NomeSala
                FROM    Recursividade R;
    
    
    
    Por favor,  marque-o como respondidas se está respondeu a sua pergunta 
    ou marcá-lo como útil se está ajudou a resolver o seu problema 
    Wesley Neves
    MTA-Database Fundamentals 
    Analista Desenvolvedor.NET


    Wesley Neves

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 31 de janeiro de 2017 14:43
    • Marcado como Resposta tracaja segunda-feira, 13 de fevereiro de 2017 14:16
    quinta-feira, 26 de janeiro de 2017 20:07
  • Boa noite,

    Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    with CTE_Rec as
    (
        select
            ID as IDPredio,
            QtdNumeroDeSalas,
            1 as NumeroSala
        from TblPredio
        
        union all
    
        select
            IDPredio,
            QtdNumeroDeSalas,
            NumeroSala + 1
        from CTE_Rec as r
        where
            NumeroSala < QtdNumeroDeSalas
    )
    
    insert into TblSalaPredio (IDPredio, NumeroSala)
        select IDPredio, NumeroSala
        from CTE_Rec
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 31 de janeiro de 2017 14:43
    • Marcado como Resposta tracaja sexta-feira, 10 de fevereiro de 2017 14:38
    quinta-feira, 26 de janeiro de 2017 20:40

Todas as Respostas

  • Oi Tracaja,
    Primeiro,você precisa pensar na modelagem,como vai ser a estrutura disso no banco...
    Você pode pensar em uma modelagem nesse sentido:

    TBLPredio
    ID - chave (autoincremento)
    QtdNumeroDeSalas

    TBLSalaPredio
    ID- chave(autoincremento)
    IDPredio(a chave da outra tabela)
    NumeroSala

    Ou seja, tabela Pai predio, filho SalaPredio.A tabela filha referencia o pai(a chave).Primeiro você cadastra o pai,depois os filhos.E eles se ligam pela chave.Entendeu?
    Não precisa ser necessáriamente assim do jeito do exemplo, pode ser TblPredio,TblPRedioAndar, TblPredioAndarSala, etc, vai da sua necessidade.

    Sobre procedure e função, a procedure apenas "encapsula" o insert, é um recurso,mas nada tem a ver com a modelagem que você vai fazer.

    A procedure é util caso você queira,por exemplo, em uma chamada só inserir um predio e um item na SalaPredio.Nesse caso, nao faz diferença você usar uma procedure ou chamar os 2 inserts, um de cada vez.


    ok?

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta

    quinta-feira, 26 de janeiro de 2017 20:01
  • Fiz com Recursividade , da uma olhada nesse exemplo, 

    CREATE TABLE Predios 
            (
              IdPredio INT NOT NULL  PRIMARY KEY ,
              QuantidadeSala INT
            );
    
    INSERT Predios
            ( IdPredio, QuantidadeSala )
    VALUES  ( 1, -- IdPredio - int
              20  -- QuantidadeSala - int
              );
    
    
    
    CREATE TABLE Salas
           (
             IdSala INT PRIMARY KEY ,
             IdPredio INT NOT NULL
                          FOREIGN KEY REFERENCES dbo.Predios ( IdPredio ) ,
             NomeSala VARCHAR(MAX),
           );
    
    WITH    Recursividade
              AS ( SELECT   IdPredio = P.IdPredio ,
                            IdSala = 1 ,
                            NomeSala = CONCAT('Sala-', 1)
                   FROM     dbo.Predios AS P
                   UNION ALL
                   SELECT   IdPredio = RS.IdPredio ,
                            IdSala = RS.IdSala + 1 ,
                            NomeSala = CONCAT('Sala-', RS.IdSala + 1)
                   FROM     Recursividade AS RS
                   WHERE    RS.IdSala < 20
                 )
         INSERT INTO dbo.Salas
                ( IdPredio ,
                  IdSala ,
                  NomeSala
                )
                SELECT  R.IdPredio ,
                        R.IdSala ,
                        R.NomeSala
                FROM    Recursividade R;
    
    
    
    Por favor,  marque-o como respondidas se está respondeu a sua pergunta 
    ou marcá-lo como útil se está ajudou a resolver o seu problema 
    Wesley Neves
    MTA-Database Fundamentals 
    Analista Desenvolvedor.NET


    Wesley Neves

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 31 de janeiro de 2017 14:43
    • Marcado como Resposta tracaja segunda-feira, 13 de fevereiro de 2017 14:16
    quinta-feira, 26 de janeiro de 2017 20:07
  • perfeito, é isso mesmo que estou fazendo, só que eu quero que a quantidade de salas seja expandida automaticamente na segunda tabela, pra que não seja necessário fazer isso na mão...

    qdo registra a quantidade de salas, imediatamente a segunda tabela cria as tantas salas....

    TBLPredio
    ID - chave (autoincremento)
    QtdNumeroDeSalas

    TBLSalaPredio
    ID- chave(autoincremento)
    IDPredio(a chave da outra tabela)
    NumeroSala

    Assim que estou montando mesmo, mas não sei fazer as salas serem enumeradas na segunda tabela, por isso achei que ia precisar de um função ou algo do tipo...que por acaso eu tbm não sei...kkkk, obrigado pela resposta....

    quinta-feira, 26 de janeiro de 2017 20:11
  • Boa noite,

    Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    with CTE_Rec as
    (
        select
            ID as IDPredio,
            QtdNumeroDeSalas,
            1 as NumeroSala
        from TblPredio
        
        union all
    
        select
            IDPredio,
            QtdNumeroDeSalas,
            NumeroSala + 1
        from CTE_Rec as r
        where
            NumeroSala < QtdNumeroDeSalas
    )
    
    insert into TblSalaPredio (IDPredio, NumeroSala)
        select IDPredio, NumeroSala
        from CTE_Rec
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 31 de janeiro de 2017 14:43
    • Marcado como Resposta tracaja sexta-feira, 10 de fevereiro de 2017 14:38
    quinta-feira, 26 de janeiro de 2017 20:40
  • beleza, vou testar, vou testar...já vou terminar o banco...

    Obrigado.

    sexta-feira, 27 de janeiro de 2017 00:49