none
Função RRS feed

  • Pergunta

  • Galera preciso fazer uma função dentro de uma procedure que retorno todos os registro que já foram inseridos na tabela 2, por exemplo:

    Tenho a tabela 1 e a tabela 2
    A tabela 1 tenho 10 registros e a tabela 2 tenho 9 registros.
    Preciso percorrer a tabela 1 para saber quais registros não foram inseridos na tabela 2 e retornar um array com esses registros.

    Como posso fazer isso?

    Obrigado





    SirSmart
    sexta-feira, 20 de novembro de 2009 22:22

Respostas

  • Faça assim:

    Select Table1.ID, Table2.ID

    From Table1
        Right Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table2.ID is null

    Se vc tiver as tabelas populadas assim:
    t1 t2
    1  1
    2  2
    3  null
    4  4
    5  5
    6  6
    7  7
    8  null
    null  9
    10  10

    Essa query vai retornar

    3 null
    8 null

    Ou seja, 3 e 8 estao presentes na tabela 1 e não na 2.

    Se vc inverter o sentido do join

    From Table1
        Left Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table1.ID is null

    Ela vai retornar

    null 9

    Ou seja, 9 esta presente na tabela 2 e não na 1.

    é isso que vc quer?

    att

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

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sábado, 21 de novembro de 2009 04:58
  • Utilize uma subquery.

    Select * from SuaTabela
    Where ID in(Select Table1.ID
    From Table1
        Right Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table2.ID is null)

    Vc não precisa usar array, mesmo pq, isso nao existe em TSQL, a não ser que vc esteja se referindo a uma matriz no C# ou VB. Ai eu sugiro postara no forum de C#.

    Att

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

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Fernanda Simões segunda-feira, 23 de novembro de 2009 13:29
    domingo, 22 de novembro de 2009 00:19
  • Bom Dia SirSmart,
    Sim vc consegue, aproveitando o exemplo do william, montei um exemplo q ilustra o fato.
    segue sintaxe:

    -- Declarando as tabelas temporárias
    DECLARE @TB1 TABLE (idT1 INT)
    DECLARE @TB2 TABLE (idT2 INT)
    
    -- Populando as tabelas temporárias
    SET NOCOUNT ON
    INSERT @tb1 
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION
    SELECT 8 UNION SELECT 10 
    
    INSERT @tb2 
    SELECT 1 UNION SELECT 2 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION
    SELECT 9 UNION SELECT 10 
    SET NOCOUNT OFF
    
    -- Efetuando a consulta, assim ira exibir os valores q não possuem na tabela 2
    SELECT 
        t1.idT1, t2.idT2 
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2
    WHERE 
        t2.idT2 IS NULL
    
    /* -- Retorno --
    idT1        idT2
    ----------- -----------
    3           NULL
    8           NULL
    
    (2 linha(s) afetadas)
    
    */
     
     -- Então este insert é para inclui na tabela 2 os valores q ela não possui não 
     -- possui referente a tabela 1 (3 e 8).
    INSERT INTO @TB2(idT2) 
    SELECT 
        t1.idT1
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2
    WHERE 
        t2.idT2 IS NULL
        
    /* -- retorno
    
    (2 linha(s) afetadas)
    
    */    
    
    -- E por fim exibe o resultado final.
    SELECT 
        t1.idT1, t2.idT2
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Fernanda Simões segunda-feira, 23 de novembro de 2009 13:29
    domingo, 22 de novembro de 2009 11:51

Todas as Respostas

  • Faça assim:

    Select Table1.ID, Table2.ID

    From Table1
        Right Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table2.ID is null

    Se vc tiver as tabelas populadas assim:
    t1 t2
    1  1
    2  2
    3  null
    4  4
    5  5
    6  6
    7  7
    8  null
    null  9
    10  10

    Essa query vai retornar

    3 null
    8 null

    Ou seja, 3 e 8 estao presentes na tabela 1 e não na 2.

    Se vc inverter o sentido do join

    From Table1
        Left Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table1.ID is null

    Ela vai retornar

    null 9

    Ou seja, 9 esta presente na tabela 2 e não na 1.

    é isso que vc quer?

    att

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

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sábado, 21 de novembro de 2009 04:58
  • Isso mesmo velho, mas como eu posso fazer para que o resultado retorne apenas 3 e 8 como um array? Pq isso é uma função e depois desse retorno eu queria pegar a variavel que contem o 3 e o 8 e fazer outro select na procedure.....

    Obrigado
    SirSmart
    sábado, 21 de novembro de 2009 21:53
  • Utilize uma subquery.

    Select * from SuaTabela
    Where ID in(Select Table1.ID
    From Table1
        Right Outer Join Table2
           On Table1.ID=Table2.ID
    Where Table2.ID is null)

    Vc não precisa usar array, mesmo pq, isso nao existe em TSQL, a não ser que vc esteja se referindo a uma matriz no C# ou VB. Ai eu sugiro postara no forum de C#.

    Att

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

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Marcado como Resposta Fernanda Simões segunda-feira, 23 de novembro de 2009 13:29
    domingo, 22 de novembro de 2009 00:19
  • Eu consigo fazer um insert com as informações retornadas do primeiro select ?

    Obrigado
    SirSmart
    domingo, 22 de novembro de 2009 05:28
  • Bom Dia SirSmart,
    Sim vc consegue, aproveitando o exemplo do william, montei um exemplo q ilustra o fato.
    segue sintaxe:

    -- Declarando as tabelas temporárias
    DECLARE @TB1 TABLE (idT1 INT)
    DECLARE @TB2 TABLE (idT2 INT)
    
    -- Populando as tabelas temporárias
    SET NOCOUNT ON
    INSERT @tb1 
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION
    SELECT 8 UNION SELECT 10 
    
    INSERT @tb2 
    SELECT 1 UNION SELECT 2 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION
    SELECT 9 UNION SELECT 10 
    SET NOCOUNT OFF
    
    -- Efetuando a consulta, assim ira exibir os valores q não possuem na tabela 2
    SELECT 
        t1.idT1, t2.idT2 
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2
    WHERE 
        t2.idT2 IS NULL
    
    /* -- Retorno --
    idT1        idT2
    ----------- -----------
    3           NULL
    8           NULL
    
    (2 linha(s) afetadas)
    
    */
     
     -- Então este insert é para inclui na tabela 2 os valores q ela não possui não 
     -- possui referente a tabela 1 (3 e 8).
    INSERT INTO @TB2(idT2) 
    SELECT 
        t1.idT1
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2
    WHERE 
        t2.idT2 IS NULL
        
    /* -- retorno
    
    (2 linha(s) afetadas)
    
    */    
    
    -- E por fim exibe o resultado final.
    SELECT 
        t1.idT1, t2.idT2
    FROM            @TB1 AS t1 
    LEFT OUTER JOIN @TB2 AS t2 ON t1.idT1 = t2.idT2

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Fernanda Simões segunda-feira, 23 de novembro de 2009 13:29
    domingo, 22 de novembro de 2009 11:51
  • Cara vc poderia me explicar esse trecho do seu código por favor

    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION
    SELECT 8 UNION SELECT 10

    Obrigado
    SirSmart
    domingo, 22 de novembro de 2009 12:15


  • /*
    O operador UNION é utilizado p/ combinar o resultado de 
    duas ou mais tabelas.
    
    se vc executar esse trecho
    */
    SELECT 1 UNION 
    SELECT 2 UNION 
    SELECT 3 UNION
    SELECT 4 UNION 
    SELECT 5 UNION 
    SELECT 6 UNION 
    SELECT 7 UNION
    SELECT 8 UNION 
    SELECT 10 
    /* -- o resultado será
    1
    2
    3
    4
    5
    6
    7
    8
    10
    
    (9 linha(s) afetadas)
    */
    
    se eu colocar o comando o INSERT e a tabela,
    ira popular a tabela com o resultado do select.
    
    INSERT @tb1 
    SELECT 1 UNION 
    SELECT 2 UNION 
    SELECT 3 UNION
    SELECT 4 UNION 
    SELECT 5 UNION 
    SELECT 6 UNION 
    SELECT 7 UNION
    SELECT 8 UNION 
    SELECT 10 
    
    /*
    assim tem o mesmo efeito se eu colocasse da
    forma abaixo.
    */
    
    INSERT INTO @tb1 (idT1) VALUES (1)
    INSERT INTO @tb1 (idT1) VALUES (2)
    INSERT INTO @tb1 (idT1) VALUES (3)
    INSERT INTO @tb1 (idT1) VALUES (4)
    INSERT INTO @tb1 (idT1) VALUES (5)
    INSERT INTO @tb1 (idT1) VALUES (6)
    INSERT INTO @tb1 (idT1) VALUES (7)
    INSERT INTO @tb1 (idT1) VALUES (8)
    INSERT INTO @tb1 (idT1) VALUES (10)
    
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    domingo, 22 de novembro de 2009 12:30
  • Como eu deixo isso dinamico, até pq eu não sei quantos registro eu tenho ? Outra coisa aonde vc aponta o nome das tabelas que serão usadas?

    Obrigado
    SirSmart
    domingo, 22 de novembro de 2009 12:34
  • Informe quais são as tabelas e os campos q vc utiliza, assim fica mais fácil de te explicar.
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 23 de novembro de 2009 08:24
  • Seguindo essa linha mesmo que vc está fazendo da tabela1 e tabela2, os campos poderiam ser : codigo, descricao e numeroPedido onde o numero do pedido é a verificação que existe em uma tabela e não na outra....

    Obrigado
    SirSmart
    segunda-feira, 23 de novembro de 2009 11:37
  • SirSmart, tente dessa forma.

    SELECT 
        t1.codigo, t1.descricao, t1.NumeroPedido
    FROM            'Sua Tabela 1' AS t1 
    LEFT OUTER JOIN 'Sua Tabela 2' AS t2 ON t1.NumeroPedido = t2.NumeroPedido
    WHERE 
        t2.NumeroPedido IS NULL
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 23 de novembro de 2009 11:45
  • Bom dia,

    Se você estiver o  SQL Server 2008 recomendo você utilizar o comando MERGE, ele pode fazer isso de forma eficiente e descomplicada.


    Espero ter ajudado

    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    segunda-feira, 23 de novembro de 2009 11:57