none
Duplicar linhas e alterar a chave de duplicação RRS feed

  • Pergunta

  • Preciso de uma ajuda

    Tenho uma tabela que uso como chave um campo varchar de 6 posições, há um valor específico "000003" que preciso duplicar todas as linhas referentes a este e alterar esta chave para "000004" mantendo os demais campos.

    Exemplo:

    Key_field   Data_1   Data_2

    000001       AAAAA    BBBBBB

    000003       CCCCC    DDDDD

    -Duplicando e mudando a chave

    Key_field   Data_1   Data_2

    000001       AAAAA    BBBBBB

    000003       CCCCC    DDDDD

    000004       CCCCC    DDDDD


    Precisava de uma estrutura de comandos em SQL (Oracle DB) para fazer isso.
    sexta-feira, 3 de janeiro de 2014 16:51

Respostas

  • Cara vc pode ultilizar cursor, mas eu sugiro criar um campo chave para sevir como index, segue o exemplo

    ALTER TABLE SUA_TABELA
    ADD ID INT IDENTITY(1,1)  PRIMARY KEY

    declare @id, @key_field, @data_1, @data_2;

    declare meu_cursor cursor for select id, key_field, data_1, data_2 from tbl where where key_field = '000003'

    open meu_cursor

    --pega a próxima linha

    fetch next from meu_cursor into @id, @key_field, @data_1, @data_2

    --varrer todas as linhas do select (no caso do cursor).

    while @@fetch_status = 0

     begin

    update tbl set key_field = '000004' where id = @id

    insert tbl (key_field, data_1, data_2) values (@key_field, @data_1, @data_2)

           fetch next from meu_cursor into @id, @key_field, @data_1, @data_2

     end

    --fechando cursor

    close meu_cursor

    --desalocando cursor

    deallocate meu_cursor

    sexta-feira, 3 de janeiro de 2014 17:46
  • Deleted
    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:32
    sexta-feira, 3 de janeiro de 2014 17:52
  • Guilherme,

    Segue abaixo um exemplo de como refazer a numeração de linhas com base em uma chave primária, fazendo uso de cursor:

    CREATE TABLE #TEMP
    ( ITEM INT,
      NUMERO CHAR(6))
    
    
    INSERT INTO #TEMP VALUES(1,'000008')
    INSERT INTO #TEMP VALUES(2,'000008')
    INSERT INTO #TEMP VALUES(3,'000008')
    INSERT INTO #TEMP VALUES(4,'000008')
    
    Declare @Contador Int,
            @Linha Int
    Set @Contador=(Select Max(Item) from #Temp)
    Set @Linha=1
    
    While @Linha < @Contador
     Begin
      If @Linha = (Select Item from #Temp Where Item = @Linha)
       Begin  
        Update #Temp
        Set Item=@Linha
        Where Item=@Linha
       End
       Else
        Begin
         Update #Temp
         Set Item=@Linha
         Where Item=@Linha+1
        End
    
      Set @Linha=@Linha+1
     End
    
    
    select * from #Temp

    Ao meu ver, o que eu estou entendendo você esta falando de duplicar uma linha, mas parece que você deseja é refazer esta numeração ou até mesmo, atualizar o valor de um determinado campo mantendo os dados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:32
    sábado, 4 de janeiro de 2014 15:15

Todas as Respostas

  • Guilherme,

        Não entendi... Você pode explicar melhor o que você está querendo fazer? Seguindo as regras de normalização você utiliza uma chave para identificar um registro que é único na sua base, duplicar ele mantendo os campos não chaves vai violar essas regras...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    sexta-feira, 3 de janeiro de 2014 16:56
    Moderador
  • Deleted
    sexta-feira, 3 de janeiro de 2014 16:58
  • Olá Roberto,

    A questão é exatamente esta, preciso em uma tabela pegar todas as linhas que tenham  em um campo  um determinado valor duplicar a linha e alterar a chave da linha que dupliquei para outro valor.

    O que estou fazerndo hoje é algo extremament trabalhoso, baixei todas as tabelas filtrei todos com a chave 000003, alterei o campo para 000004 e realizei um insert...values na tabela.

    Pior que estas tabelas não estão simétricas, mesmo utilizando o NOTEPAD ++ ta impossível de fazer, total são 400 tabelas.

    sexta-feira, 3 de janeiro de 2014 17:01
  • Correto, gostaria de duplica-la e criar uma nova chave.

    Como no exemplo abaixo:

    O 000004 é uma cópia do 000003:

    Key_field   Data_1   Data_2

    000001        AAAAA    BBBBBB

    000003       CCCCC    DDDDD

    000004       CCCCC    DDDDD

    sexta-feira, 3 de janeiro de 2014 17:04
  • A questão maior não é mudar a chave e sim a combinação entre duplicar a linha e mudar uma chave de busca.

    Podem sim haver mais de uma linha com esta mesma chave, olhem o modelo de incert que criei para uma tabela

    insert CBR_ACCOUNT_TYPE
    (INSTITUTION_NUMBER,ACCOUNT_TYPE_ID,RECORD_DATE,ACCOUNT_CATEGORY,ACCOUNT_MATURITY,SHADOW_ACCOUNT_FLAG,EXCLUDE_INTEREST_FLAG,
    CASH_RETAIL_FLAG,PAYMENT_METHOD,INTEREST_CAP_TARGET,AUDIT_TRAIL,CREATE_ON_DEMAND,REFUND_METHOD,INTEREST_METHOD,BONUS_METHOD,LOCKING_COUNTER)
    values
    ('00000004','070','201400130','005','001','000','','','000','000','SETUP NEW INSTITUTION 004','','000','000','000','0'),
    ('00000004','075','201400130','005','001','000','','','000','000','SETUP NEW INSTITUTION 004','','000','000','000','0'),

    O campo instutution_number é a chave que uso que atualmente está com valor '00000003' preciso duplicar todas as linhas usando agora o valor '00000004' , em resumo ele é minha chave e o único campo que altero em toda a linha.

    sexta-feira, 3 de janeiro de 2014 17:27
  • Cara vc pode ultilizar cursor, mas eu sugiro criar um campo chave para sevir como index, segue o exemplo

    ALTER TABLE SUA_TABELA
    ADD ID INT IDENTITY(1,1)  PRIMARY KEY

    declare @id, @key_field, @data_1, @data_2;

    declare meu_cursor cursor for select id, key_field, data_1, data_2 from tbl where where key_field = '000003'

    open meu_cursor

    --pega a próxima linha

    fetch next from meu_cursor into @id, @key_field, @data_1, @data_2

    --varrer todas as linhas do select (no caso do cursor).

    while @@fetch_status = 0

     begin

    update tbl set key_field = '000004' where id = @id

    insert tbl (key_field, data_1, data_2) values (@key_field, @data_1, @data_2)

           fetch next from meu_cursor into @id, @key_field, @data_1, @data_2

     end

    --fechando cursor

    close meu_cursor

    --desalocando cursor

    deallocate meu_cursor

    sexta-feira, 3 de janeiro de 2014 17:46
  • Deleted
    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:32
    sexta-feira, 3 de janeiro de 2014 17:52
  • Guilherme,

    Segue abaixo um exemplo de como refazer a numeração de linhas com base em uma chave primária, fazendo uso de cursor:

    CREATE TABLE #TEMP
    ( ITEM INT,
      NUMERO CHAR(6))
    
    
    INSERT INTO #TEMP VALUES(1,'000008')
    INSERT INTO #TEMP VALUES(2,'000008')
    INSERT INTO #TEMP VALUES(3,'000008')
    INSERT INTO #TEMP VALUES(4,'000008')
    
    Declare @Contador Int,
            @Linha Int
    Set @Contador=(Select Max(Item) from #Temp)
    Set @Linha=1
    
    While @Linha < @Contador
     Begin
      If @Linha = (Select Item from #Temp Where Item = @Linha)
       Begin  
        Update #Temp
        Set Item=@Linha
        Where Item=@Linha
       End
       Else
        Begin
         Update #Temp
         Set Item=@Linha
         Where Item=@Linha+1
        End
    
      Set @Linha=@Linha+1
     End
    
    
    select * from #Temp

    Ao meu ver, o que eu estou entendendo você esta falando de duplicar uma linha, mas parece que você deseja é refazer esta numeração ou até mesmo, atualizar o valor de um determinado campo mantendo os dados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:32
    sábado, 4 de janeiro de 2014 15:15