none
Ajuda com Instrução RRS feed

  • Pergunta

  • Pessoal

    Como Faço esta Instrução

    Select a.*,b.*,c.*
    From #TabelaA a 
    Join #TabelaB b
    On a.ID = b.Boleto_Id
    Join #TabelaC c
    On a.Id = c.Boleto_Id
    Where c.ServicoTaxa_Id = 89
    And c.ServicoTaxa_Id = 98
    And c.ServicoTaxa_Id = 99

    Preciso que todos os codigos (neste caso 89,98,99)
    retornem na minha Instrução,
    Como Faço?

    Maricelmo

    quarta-feira, 5 de setembro de 2012 13:43

Respostas

  • boa tarde, Marcelino
    veja este teste que fiz

     CREATE TABLE #TabelaA
     (
        ID Int Identity(1,1) NOT NULL,
        BoletoSituacao_Id Int NULL,
        Emissao DateTime,
        Vencimento DateTime,
        ParcelaValor Decimal(18,2)
     )

    GO

     CREATE TABLE #TabelaB
     (
        Boleto_Id Int NOT NULL,
        Placa Varchar(7) NULL,
    DataAlteracao Datetime    
     )
     GO
     
      CREATE TABLE #TabelaC
     (
        Boleto_Id Int NOT NULL,
    ServicoTaxa_Id Int NOT NULL,
    Valor Decimal(18,2)
     )
     Go
    select * from #TabelaA

    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),100.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),200.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),300.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),400.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),500.00)

    select * from #TabelaB

    Insert #TabelaB
    ( Boleto_Id,
    Placa,
    DataAlteracao
    )
    (Select ID,null,GETDATE() From #TabelaA)

    Go
    select * from #TabelaC

    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,91,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,100,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(5,91,1.00)

    Select 
    c.Boleto_Id
    From 
    #TabelaA a Join 
    #TabelaB b On a.ID = b.Boleto_Id Join 
    #TabelaC c On a.Id = c.Boleto_Id
    Where 
    c.ServicoTaxa_Id IN (89,98,99)
    GROUP BY 
    c.Boleto_Id--,c.ServicoTaxa_Id
    HAVING 
    COUNT(DISTINCT c.ServicoTaxa_Id) = 3

    Resultado

    Boleto_Id
    2
    3

    Porem o Boleto_Id Numero 3
    exstem 4 codigos (89,98,99,100)
    não deveria me retornar

    Maricelmo


    tente assim:

    Select 
        c.Boleto_Id
    From 
    #TabelaA a Join 
    #TabelaB b On a.ID = b.Boleto_Id Join 
    #TabelaC c On a.Id = c.Boleto_Id
    Where 
        c.ServicoTaxa_Id IN (89,98,99)
    GROUP BY 
    c.Boleto_Id
    HAVING 
        COUNT(DISTINCT c.ServicoTaxa_Id) = 3
    and not exists(select 1 from #TabelaC as x where x.Boleto_Id = c.Boleto_Id and x.ServicoTaxa_Id not IN (89,98,99))


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Maricelmo quinta-feira, 6 de setembro de 2012 14:16
    quarta-feira, 5 de setembro de 2012 19:11

Todas as Respostas

  • Bom dia Maricelmo,

    Você pode usar IN.

    Where c.ServicoTaxa_Id in (89,98,99)

    At.
    Rafael

    quarta-feira, 5 de setembro de 2012 13:49
  • bom dia, Rafael

    Então, Não posso usar IN
    porque eu desejo o conjunto
    dos três codigos, porque
    na tabela, existe esta
    sequencia de codigos (89,90,91)
    se eu usar o IN esta sequencia
    vira como resultado.


    Maricelmo

    quarta-feira, 5 de setembro de 2012 14:21
  • Não virá não. Pode testar.

    A solução do Rafael está ok.

    Neste caso o in é a mesma coisa que:

    Where c.ServicoTaxa_Id = 89
    OR c.ServicoTaxa_Id = 98
    OR c.ServicoTaxa_Id = 99


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 5 de setembro de 2012 14:56
    Moderador
  • bom dia Robson,

    Então, eu testei e o retorno 
    não era o que eu esperava,
    talvez, não me fiz entender
    muito bem,
    explicarei melhor:

    preciso que retorne os três Codigos (89,98,99)
    caso haja apenas um (01) , não preciso
    tem que ser os três ou nada,
    e desta forma usando o IN, se tiver o
    codigo 89 vira, ou se tiver o codigo 98 tambem
    vira, ou ainda se existir o codigo 99, mas eu
    preciso que exista os três,
    entendeu!


    Maricelmo


    • Editado Maricelmo quarta-feira, 5 de setembro de 2012 15:07
    quarta-feira, 5 de setembro de 2012 15:06
  • Boa tarde, segue sugestão:

        Select 
            c.Boleto_Id 
        From 
            #TabelaA a Join 
            #TabelaB b On a.ID = b.Boleto_Id Join 
            #TabelaC c On a.Id = c.Boleto_Id
        Where 
            c.ServicoTaxa_Id IN (89,98,99)
        GROUP BY 
            c.Boleto_Id
        HAVING 
            COUNT(DISTINCT c.ServicoTaxa_Id) = 3


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    quarta-feira, 5 de setembro de 2012 16:04
  • Agora sim você de uma informação diferente, rs.

    Tente fazer Joins com SubSelects de suas condições.

    Exemplo:

    Select
      a.*,
      b.*,
      c.*
    From
      #TabelaA a Join #TabelaB b On a.ID = b.Boleto_Id
                 Join #TabelaC c On a.Id = c.Boleto_Id
                      Join (Select Distinct ServicoTaxa_Id From #TabelaC Where ServicoTaxa_Id = 89) C1 on (C1.ServicoTaxa_Id = C.ServicoTaxa_Id)
                      Join (Select Distinct ServicoTaxa_Id From #TabelaC Where ServicoTaxa_Id = 98) C2 on (C2.ServicoTaxa_Id = C.ServicoTaxa_Id)
                      Join (Select Distinct ServicoTaxa_Id From #TabelaC Where ServicoTaxa_Id = 99) C3 on (C3.ServicoTaxa_Id = C.ServicoTaxa_Id)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 5 de setembro de 2012 16:55
    Moderador
  • boa tarde, Marcelino
    veja este teste que fiz

     CREATE TABLE #TabelaA
     (
        ID Int Identity(1,1) NOT NULL,
        BoletoSituacao_Id Int NULL,
        Emissao DateTime,
        Vencimento DateTime,
        ParcelaValor Decimal(18,2)
     )

    GO

     CREATE TABLE #TabelaB
     (
        Boleto_Id Int NOT NULL,
        Placa Varchar(7) NULL,
    DataAlteracao Datetime    
     )
     GO
     
      CREATE TABLE #TabelaC
     (
        Boleto_Id Int NOT NULL,
    ServicoTaxa_Id Int NOT NULL,
    Valor Decimal(18,2)
     )
     Go
    select * from #TabelaA

    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),100.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),200.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),300.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),400.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),500.00)

    select * from #TabelaB

    Insert #TabelaB
    ( Boleto_Id,
    Placa,
    DataAlteracao
    )
    (Select ID,null,GETDATE() From #TabelaA)

    Go
    select * from #TabelaC

    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,91,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,100,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(5,91,1.00)

    Select 
    c.Boleto_Id
    From 
    #TabelaA a Join 
    #TabelaB b On a.ID = b.Boleto_Id Join 
    #TabelaC c On a.Id = c.Boleto_Id
    Where 
    c.ServicoTaxa_Id IN (89,98,99)
    GROUP BY 
    c.Boleto_Id--,c.ServicoTaxa_Id
    HAVING 
    COUNT(DISTINCT c.ServicoTaxa_Id) = 3

    Resultado

    Boleto_Id
    2
    3

    Porem o Boleto_Id Numero 3
    exstem 4 codigos (89,98,99,100)
    não deveria me retornar

    Maricelmo


    • Editado Maricelmo quarta-feira, 5 de setembro de 2012 17:29
    quarta-feira, 5 de setembro de 2012 17:28
  • boa tarde, Marcelino
    veja este teste que fiz

     CREATE TABLE #TabelaA
     (
        ID Int Identity(1,1) NOT NULL,
        BoletoSituacao_Id Int NULL,
        Emissao DateTime,
        Vencimento DateTime,
        ParcelaValor Decimal(18,2)
     )

    GO

     CREATE TABLE #TabelaB
     (
        Boleto_Id Int NOT NULL,
        Placa Varchar(7) NULL,
    DataAlteracao Datetime    
     )
     GO
     
      CREATE TABLE #TabelaC
     (
        Boleto_Id Int NOT NULL,
    ServicoTaxa_Id Int NOT NULL,
    Valor Decimal(18,2)
     )
     Go
    select * from #TabelaA

    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),100.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),200.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),300.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),400.00)
    Insert Into #TabelaA Values(2,GETDATE(),GETDATE(),500.00)

    select * from #TabelaB

    Insert #TabelaB
    ( Boleto_Id,
    Placa,
    DataAlteracao
    )
    (Select ID,null,GETDATE() From #TabelaA)

    Go
    select * from #TabelaC

    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(1,91,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(2,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,98,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,99,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(3,100,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,89,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(4,90,1.00)
    Insert Into #TabelaC (Boleto_Id,ServicoTaxa_Id,Valor) Values(5,91,1.00)

    Select 
    c.Boleto_Id
    From 
    #TabelaA a Join 
    #TabelaB b On a.ID = b.Boleto_Id Join 
    #TabelaC c On a.Id = c.Boleto_Id
    Where 
    c.ServicoTaxa_Id IN (89,98,99)
    GROUP BY 
    c.Boleto_Id--,c.ServicoTaxa_Id
    HAVING 
    COUNT(DISTINCT c.ServicoTaxa_Id) = 3

    Resultado

    Boleto_Id
    2
    3

    Porem o Boleto_Id Numero 3
    exstem 4 codigos (89,98,99,100)
    não deveria me retornar

    Maricelmo


    tente assim:

    Select 
        c.Boleto_Id
    From 
    #TabelaA a Join 
    #TabelaB b On a.ID = b.Boleto_Id Join 
    #TabelaC c On a.Id = c.Boleto_Id
    Where 
        c.ServicoTaxa_Id IN (89,98,99)
    GROUP BY 
    c.Boleto_Id
    HAVING 
        COUNT(DISTINCT c.ServicoTaxa_Id) = 3
    and not exists(select 1 from #TabelaC as x where x.Boleto_Id = c.Boleto_Id and x.ServicoTaxa_Id not IN (89,98,99))


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Maricelmo quinta-feira, 6 de setembro de 2012 14:16
    quarta-feira, 5 de setembro de 2012 19:11
  • Bom dia!
    Leonardo Marcelino,

    Muito Obrigado!, era isso que eu precisava

    Funcionou direitinho!


    Maricelmo

    quinta-feira, 6 de setembro de 2012 14:16