none
Utilizando o IN como AND, não OR RRS feed

  • Pergunta

  • Bom dia a todos,

    tenho um problema sql e gostaria de algumas sugestões para esta consulta, já que não consigo acertar uma forma ideal.
    Tenho a tabela demonstrativa "a", gostaria de realizar o IN nos registros retornando apenas os cd's 9 e 7 já que são os unicos que possuem a combinação AND para 1 e 3. O cd 8 possue apenas o 3 e não poderia ser apresentado. Não sei se fui bem claro, tenho um problema semelhante com respostas de um questionario e a solução seria a mesma.

    select cd from 
    (
    select 9 cd, 0 q union
    select 9, 1 union
    select 9, 3 union
    select 7, 0 union
    select 7, 1 union
    select 7, 3 union
    select 8, 0 union
    select 8, 2 union
    select 8, 3
    ) a
    where q in (1, 3)
    group by cd
    Atenciosamente,
    Jefferson Soares Biernstki
    Jefferson Soares
    quinta-feira, 15 de outubro de 2009 14:15

Respostas

Todas as Respostas

  • Olá Jefferson Soares,

    O Operador IN, busca os valores dos campos da entidade onde seja igual aos valores passados junto com o operador IN, como você esta fazendo

    Q IN (1, 3)então ele só ira comparar os valores do campo Q.

    Segue exemplo de acordo com a sua necessidade.

    SELECT CD FROM

    (

          SELECT 9 AS CD, 0 AS Q  UNION

          SELECT 9, 1                  UNION

          SELECT 9, 3                  UNION

          SELECT 7, 0                  UNION

          SELECT 7, 1                  UNION

          SELECT 7, 3                  UNION

          SELECT 8, 0                  UNION

          SELECT 8, 2                  UNION

          SELECT 8, 3

    ) AS A

       WHERE Q IN (1, 3) AND CD IN (9, 7)

    GROUP BY CD

    Resultado.

    CD

    -----------

    7

    9

     

    (2 row(s) affected)

    Qualquer dúvida é só publicar, estarei sempre à disposição para melhor lhe atender.

    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/
    quinta-feira, 15 de outubro de 2009 14:37
  • Entendi o problema,  mas como não conheço o cenário completo sugiro dar uma olhada nos comandos except e intersect que acho que podem te ajudar 

    ex.: 

    select

     

    cd from

    (

    select

     

    9 cd, 0 q union

    select

     

    9, 1 union

    select

     

    9, 3 union

    select

     

    7, 0 union

    select

     

    7, 1 union

    select

     

    7, 3 union

    select

     

    8, 0 union

    select

     

    8, 2 union

    select

     

    8, 3

    )

     

    a

    where

     

    q =1

    group

     

    by cd

    except

    select

     

    cd from

    (

    select

     

    9 cd, 0 q union

    select

     

    9, 1 union

    select

     

    9, 3 union

    select

     

    7, 0 union

    select

     

    7, 1 union

    select

     

    7, 3 union

    select

     

    8, 0 union

    select

     

    8, 2 union

    select

     

    8, 3

    )

     

    a

    where

     

    q = 2

    group

     

    by cd

     

     


    Att. Leandro Hexsel Bugalho
    quinta-feira, 15 de outubro de 2009 14:43
  • Boa Tarde,

    Esse problema é conhecido como divisão relacional e não é possível de solucioná-lo com os operadores IN, AND e OR de forma tão simplista assim. Já abordei sobre o mesmo em algumas ocasiões aqui no fórum, mas você encontrará uma explicação mais detalhada (e várias soluções) no link abaixo:

    A divisão relacional (quando o AND e o OR não funcionam)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!360.entry

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Hash Indexes – Uma implementação no SQL Server – Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!750.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 15 de outubro de 2009 16:18
  • Obrigado a todos pelas sugestões,

    entao, nunca tinha ouvido falar nessa tal de divisão relacional e era esse mesmo o problema, utilizei a ultima consulta da guia.

    Obrigado,

    Jefferson Soares Biernastki
    Devenvolvimento - Novas Tecnologias
    http://www.krlaboral.com.br/onlaboral
    http://pixeljef.wordpress.com
    Jefferson Soares
    quinta-feira, 15 de outubro de 2009 18:27