Usuário com melhor resposta
Utilizando o IN como AND, não OR

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
Respostas
-
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.comHash 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- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 15 de outubro de 2009 16:19
- Marcado como Resposta Jefferson Soares Biernastki quinta-feira, 15 de outubro de 2009 18:27
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 fazendoQ 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
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/ -
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 -
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.comHash 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- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 15 de outubro de 2009 16:19
- Marcado como Resposta Jefferson Soares Biernastki quinta-feira, 15 de outubro de 2009 18:27
-
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