none
INSERIR REGISTROS DE OUTRA TABELA RRS feed

  • Pergunta

  • Bom dai a todos, será que alguém poderia me ajuda com esse probleminha, seguinte tenho duas tabelas aparentemente identicas a diferença entre as daus é que em uma delas tem uma PK a mais enquanto na outra o mesmo campo não é PK, a duvida é: peciso faze uma PROC para tira os registros da tabela que tem todas as PKs e inserir na tabela que falta uma, minha solução seria esta fazendo um gatinho, rsrs com uma das PKs, por ex: checaria se as 3 primeiras PKs tem o mesmo registro gravado mais de uma vez, se tive eu somaria mais 1 na quarta PK.
    Obs: seria feito isso só na tabela que iria inserir os registros, enquanto a tabela de origem ficaria original
    sexta-feira, 11 de dezembro de 2009 13:10

Respostas

  • André segue exemplo, simulando o q deseja.

    --> tabela temporária (cte) p/ simular a tb Filial
    ;WITH Filial (Planro_PK, plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK, AptCarrete_PK)
    AS
    (
        SELECT 1, 1, 1, 1, 1, 1 UNION
        SELECT 1, 1, 1, 1, 1, 2 UNION
        SELECT 1, 1, 1, 1, 1, 3 
    )
    
    
    --  insert Matriz
        SELECT Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
        row_number() over (partition by Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK ORDER BY AptCarrete_PK asc) as aptsequenc_PK_Novo,
        AptCarrete_PK as AptCarrete_Comum
        FROM Filial
    
    
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:23
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:48
    sexta-feira, 11 de dezembro de 2009 16:22
  • Segue novo script detalhado.

    USE tempdb
    GO
    
    
    CREATE TABLE Filial
    (
    Planro_PK     INT , 
    plaiteproc_PK INT , 
    plaitemaq_PK  INT , 
    plaprcseq_PK  INT ,   
    aptsequenc_PK INT ,  
    AptCarrete_PK INT 
    CONSTRAINT PK_Filial PRIMARY KEY(Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK, aptsequenc_PK,AptCarrete_PK)
    )
    
    CREATE TABLE Matriz
    (
    Planro_PK     INT , 
    plaiteproc_PK INT , 
    plaitemaq_PK  INT , 
    plaprcseq_PK  INT ,   
    aptsequenc_PK INT ,  
    AptCarrete_COMUM INT 
    CONSTRAINT PK_MATRIZ PRIMARY KEY(Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK, aptsequenc_PK)
    )
    
    
    --POPULANDO A TABELA FILIAL COM OS DADOS INFORMADOS POR VC
    INSERT Filial
    SELECT 1, 1, 1, 1, 1, 1 UNION
    SELECT 1, 1, 1, 1, 1, 2 UNION
    SELECT 1, 1, 1, 1, 1, 3 
    
    -- INSERI OS REGISTROS NA TABELA MATRIZ, CALCULANDO O aptsequenc_PK
    INSERT MATRIZ
    SELECT Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
    ROW_NUMBER() 
    over (PARTITION BY Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK 
          ORDER BY AptCarrete_PK asc) as aptsequenc_PK_Novo,
    AptCarrete_PK as AptCarrete_Comum
    FROM Filial
    
    -- RESULTADO FINAL DA TABELA MATRIZ
    SELECT * FROM MATRIZ
    
    
    /*
    Planro_PK   plaiteproc_PK plaitemaq_PK plaprcseq_PK aptsequenc_PK AptCarrete_COMUM
    ----------- ------------- ------------ ------------ ------------- ----------------
    1           1             1            1            1             1
    1           1             1            1            2             2
    1           1             1            1            3             3
    
    (3 linha(s) afetadas)
    */
    
    DROP TABLE MATRIZ
    DROP TABLE FILIAL

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    sexta-feira, 11 de dezembro de 2009 19:54
  • Utilize o row_number
    Assim:

    inserto into tabela_sistema_erp (Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK ,AptCarrete_PK, outros_campos)
    select 
    Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
    ROW_NUMBER() OVER 
        (PARTITION BY AptCarrete_PK ORDER BY Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  AptCarrete_PK) AS aptsequenc_PK,
    AptCarrete_PK, 
    outros_campos
    from tabela_sistema_automacao

    Eu nunca testei com chaves multiplas, mas creio que a saida seja usar algo parecido com o codigo acima (nao testei aqui)

    veja mais em 

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:48
    sexta-feira, 11 de dezembro de 2009 16:27
  • Nao, vc esta usando o partition errado
    ao inves de

    PARTITION BY apt2.AptCarrete ORDER BY apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq,apt2.AptCarrete ASC
    use
    PARTITION BY apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq ORDER BY apt2.AptCarrete ASC

    att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:47
    sexta-feira, 11 de dezembro de 2009 20:36

Todas as Respostas

  • Olá Andrer,

    Você poderia melhor explicar.

    Eu particulamente não compreendir perfeitamente o que você deseja !

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com

    sexta-feira, 11 de dezembro de 2009 14:03
  • Voce pode postar a estrututra das duas tabelas e um exemplo de dados que a tablea fonte contem? Será muito masi facil de ajudar

    Att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sexta-feira, 11 de dezembro de 2009 15:00
  • Boa tarde a todos, segue o ex:

    ---Tabela original dos registros

    planro_PK 

    plaiteproc_PK  plaitemaq_PK  plaprcseq_PK  aptsequenc_PK     AptCarrete_PK

       1               1                  1                   1                       1                   1
       1               1                  1                   1                       1                   2
       1               1                  1                   1                       1                   3


    --Tabela a ser inserido os registros da tabela original

    Planro_PK 

    Plaiteproc_PK  Plaitemaq_PK  Plaprcseq_PK  Aptsequenc_PK    AptCarrete(campo comum)

       1               1                  1                   1                       1                   1
       1               1                  1                   1                       2                   2
       1               1                  1                   1                       3                   3


    Se tenta inserir os registros direto sem nenhum tratamento (gato) ele me dara proplema de chave duplicada, corrteo? Pois na tabela original eu tenho 5 PKs e na outra tabela tenho apenas 4..

    sexta-feira, 11 de dezembro de 2009 15:34
  • Olá Andre,

    Depois que você colocou os dados ficou mais claro, porem esta meio confuso para mim o que você realmente quer!

    Poderia explicar de outra forma?

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Hebertron Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog:
    http://heberton-melo.spaces.live.com
    sexta-feira, 11 de dezembro de 2009 15:45
  • Eu creio que sua estrutura esta bem estranha, duas tabelas que sao semelhantes (possuem os mesmos campos, mas chaves diferentes) e sua necessidade de copiar (persistir) registros de uma para a outra (por que? a informaçao nao pode ser obtida atraves de um relacionamento? Digo, um SELECT FROM A inner join B? )

    Vc poderia nos dizer sua real necessidade? 

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sexta-feira, 11 de dezembro de 2009 15:53
  • Olá Andre,

    Concordo plenamente com William, pois esta muito estranha a estrutura e complicado de entender, nos diga ai qual o verdadeiro problema.

    Hebertron Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog:
    http://heberton-melo.spaces.live.com
    sexta-feira, 11 de dezembro de 2009 15:56
  • Heberton, seguinte seria assim:  na minha tabela original do banco de dados da filial tenho os seguintes campos chaves(PKs)
    Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK,     AptCarrete_PK.

    no meu banco de dados da matriz tenho os seguintes campos chaves(PKs)
    Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK


    como vc pode perceber na tabela da filial tenho 6 campos chaves, e na tabela da matriz tenho 5, se eu tenta inserir os registros da tabela da filial na matriz ira me da erro de constraints, devido aos campos Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK, que são identicos porém o meu campo AptCarrete na matriz não é chave(PK), por esse motivo preciso faze com que toda vez que tiver mais de um registros do mesmo Plano.... precisaria somar mais 1 no campo aptsequenc_PK....

    lembrando que as tabelas são identicas, a diferença é que um campo na filial é chave e na matriz ele é um campo comum..



    ve se vc consegue entende o que estou querendo dizer agora....
    sexta-feira, 11 de dezembro de 2009 15:58
  • William concordo plenamente com vc, uma das tabelas esta correta as chaves estão corretas, mas como vc pode perceber a segunda ja não posso dizer o mesmo, pois não esta batendo com a primeira (falha de definição), porém agora não posso para o pessoal que modelou essa segunda tabela remodelar, senão terei muito mais problemas.
    Obs: a primeira tabela (Correta) é um sistema de automação, a segunda tabela é do sistema de ERP da empresa.
    resumindo são sistemas diferentes porém preciso ter as mesmas informações nos dois.....
    sexta-feira, 11 de dezembro de 2009 16:04
  • A mesma informaçao vc nunca vai conseguir ter. Existem formas de vc inserir os dados e criar o sequenciamento na coluna aptsequenc_PK usando algumas tecnicas (se vc estiver usando SQL 2005 ou 2008 fica facil)

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sexta-feira, 11 de dezembro de 2009 16:13
  • Andre qual a versão do seu sql ?
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    sexta-feira, 11 de dezembro de 2009 16:15
  • William estou usando o SQL Server 2005 standard, como eu especifiquei no meu exemplo, cada plano que tiver mais de um registro na tabela ele tera que soma mais 1 na sequência pra que não aja problema de duplicidade esse tratamento irei faze em uma proc...
    sexta-feira, 11 de dezembro de 2009 16:16
  • André segue exemplo, simulando o q deseja.

    --> tabela temporária (cte) p/ simular a tb Filial
    ;WITH Filial (Planro_PK, plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK, AptCarrete_PK)
    AS
    (
        SELECT 1, 1, 1, 1, 1, 1 UNION
        SELECT 1, 1, 1, 1, 1, 2 UNION
        SELECT 1, 1, 1, 1, 1, 3 
    )
    
    
    --  insert Matriz
        SELECT Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
        row_number() over (partition by Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK ORDER BY AptCarrete_PK asc) as aptsequenc_PK_Novo,
        AptCarrete_PK as AptCarrete_Comum
        FROM Filial
    
    
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:23
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:48
    sexta-feira, 11 de dezembro de 2009 16:22
  • Olá Andre,

    Entre essas duas tabelas existe algum relacionamento um para um?

    Se exitir sua lógica de querer somar mais um não é possível pelo fato da integridade referencial, com isso essa não seria a alternativa viável de se esta resolvendo tal problema.

    OBS: Você quer consultar ou inserir somando mais um?

    Hebertron Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog:
    http://heberton-melo.spaces.live.com

    sexta-feira, 11 de dezembro de 2009 16:23
  • Utilize o row_number
    Assim:

    inserto into tabela_sistema_erp (Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  aptsequenc_PK ,AptCarrete_PK, outros_campos)
    select 
    Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
    ROW_NUMBER() OVER 
        (PARTITION BY AptCarrete_PK ORDER BY Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  AptCarrete_PK) AS aptsequenc_PK,
    AptCarrete_PK, 
    outros_campos
    from tabela_sistema_automacao

    Eu nunca testei com chaves multiplas, mas creio que a saida seja usar algo parecido com o codigo acima (nao testei aqui)

    veja mais em 

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:48
    sexta-feira, 11 de dezembro de 2009 16:27
  • Obrigado a todos, que estão me dando uma força, irei faze alguns teste com essas sugestões após termina darei um alô.... obrigado
    sexta-feira, 11 de dezembro de 2009 17:06
  • Boa tarde Leonardo não consegui entender seu script.
    William, testei o seu mas infelizmente não obtive exito, pelo que entendi sobre as funções "PARTITION BY", ele só ordena por uma determinada partição . E na inserção dos registros o sql ira checar as chaves no meu caso  Planro_PK  Plaiteproc_PK  Plaitemaq_PK  Plaprcseq_PK  Aptsequenc_PK que se encontra na tabela da matriz, ou seja a tabela que possui falha de modelagem....
    sexta-feira, 11 de dezembro de 2009 19:32
  • Segue novo script detalhado.

    USE tempdb
    GO
    
    
    CREATE TABLE Filial
    (
    Planro_PK     INT , 
    plaiteproc_PK INT , 
    plaitemaq_PK  INT , 
    plaprcseq_PK  INT ,   
    aptsequenc_PK INT ,  
    AptCarrete_PK INT 
    CONSTRAINT PK_Filial PRIMARY KEY(Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK, aptsequenc_PK,AptCarrete_PK)
    )
    
    CREATE TABLE Matriz
    (
    Planro_PK     INT , 
    plaiteproc_PK INT , 
    plaitemaq_PK  INT , 
    plaprcseq_PK  INT ,   
    aptsequenc_PK INT ,  
    AptCarrete_COMUM INT 
    CONSTRAINT PK_MATRIZ PRIMARY KEY(Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK, aptsequenc_PK)
    )
    
    
    --POPULANDO A TABELA FILIAL COM OS DADOS INFORMADOS POR VC
    INSERT Filial
    SELECT 1, 1, 1, 1, 1, 1 UNION
    SELECT 1, 1, 1, 1, 1, 2 UNION
    SELECT 1, 1, 1, 1, 1, 3 
    
    -- INSERI OS REGISTROS NA TABELA MATRIZ, CALCULANDO O aptsequenc_PK
    INSERT MATRIZ
    SELECT Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK,  
    ROW_NUMBER() 
    over (PARTITION BY Planro_PK,  plaiteproc_PK,  plaitemaq_PK,  plaprcseq_PK 
          ORDER BY AptCarrete_PK asc) as aptsequenc_PK_Novo,
    AptCarrete_PK as AptCarrete_Comum
    FROM Filial
    
    -- RESULTADO FINAL DA TABELA MATRIZ
    SELECT * FROM MATRIZ
    
    
    /*
    Planro_PK   plaiteproc_PK plaitemaq_PK plaprcseq_PK aptsequenc_PK AptCarrete_COMUM
    ----------- ------------- ------------ ------------ ------------- ----------------
    1           1             1            1            1             1
    1           1             1            1            2             2
    1           1             1            1            3             3
    
    (3 linha(s) afetadas)
    */
    
    DROP TABLE MATRIZ
    DROP TABLE FILIAL

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    sexta-feira, 11 de dezembro de 2009 19:54
  • Leonardo deixa eu ver se entendi como funciona o schema do partition by ele esta jogando o valor do campo Planro_PK no campo do aptsequenc_pk, seria isso ??? executei seu exemplo deu certo mas colocando o meu ele da erro de chave, segue meu script:::


    INSERT

     

    INTO widl.APT1002

     

    SELECT apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq,

     

    ROW_NUMBER() OVER (PARTITION BY apt2.AptCarrete ORDER BY apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq,apt2.AptCarrete ASC) AS aptsequenc

     

    , convert(varchar,apt2.Aptdataini,112) AS DATA,convert(varchar,apt2.Aptdataini,108)AS [HORA INICI]

     

    , convert(varchar,apt2.Aptdatafin,108) AS [HORA FINAL],apt2.Apttempo , apt2.Aptturcod, apt2.Aptfuncion

     

    , apt2.Aptmaqcod, apt2.Aptplartse, apt2.aptsitapOF, apt2.aptusucod,apt2.aptalmcod, apt2.aptsitforn, apt2.aptqtd

     

    , apt2.aptusado, apt2.AptCarrete, apt2.Aptnaoconf

    FROM

     

    BMTLSODB01.FactoryNews1_Teste.dbo.APT1002 apt2

    sexta-feira, 11 de dezembro de 2009 20:25
  • Nao, vc esta usando o partition errado
    ao inves de

    PARTITION BY apt2.AptCarrete ORDER BY apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq,apt2.AptCarrete ASC
    use
    PARTITION BY apt2.Planro, apt2.plaiteproc, apt2.plaitemaq, apt2.plaprcseq ORDER BY apt2.AptCarrete ASC

    att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Andre_Bel sexta-feira, 11 de dezembro de 2009 20:47
    sexta-feira, 11 de dezembro de 2009 20:36
  • Muito obrigado a todos, era isso mesmo William / Leonardo, eu estava errando nas minhas chaves do PARTITION, rsrs, mas agora deu certinho como estava precisando, valeu bom final de semana a todos

    sexta-feira, 11 de dezembro de 2009 20:47