Comparando conjuntos em sql

11 respostas
ranophoenix

Tenho um relacionamento muitos-para-muitos e quero selecionar todos os registros de uma tabela onde pelo menos um elemento do conjunto A apareça no conjunto B. Alguém já passou por algum problema parecido que possa ajudar!?

Ex:

Seria uma coisa mais ou menos assim:

SELECT *
FROM Tabela
WHERE
(SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto A
COMPARADOR(?essa é a dúvida)
(outro SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto B

11 Respostas

T

Não sou especialista em queries, mas sei que dependendo do banco de dados, além da cláusula UNION (e UNION DISTINCT), existe a cláusula MINUS, EXCEPT ou INTERSECT.
Essas cláusulas estão presentes no HSQLDB.
No Oracle, existem UNION, UNION ALL, MINUS e INTERSECT.

ranophoenix

Estou usando o PostgreSql. Vou dar uma olhada na documentação para ver se existe estes operadores que vc me disse. Seria ótimo se existe um IN de conjunto para conjunto e não só de elemento para conjunto.

Brigadão amigo!

ranophoenix

Ficou assim:

SELECT *
FROM Tabela
WHERE EXISTS (
(SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto A
INTERSECT
(outro SELECT com várias linhas para uma coluna como resultado) )//Seria o conjunto B

Isto é, se pelo menos um elemento do conjunto A for igual a um elemento do conjunto B, então exiba o registro. E agora um desafio:

E se eu quiser exibir um registro se, e somente se, o conjunto A for igual ao conjunto B.

Até mais.

kartler

Select duplo não resolveria seu problema ?

ranophoenix

Como assim???

F

ranophoenix:
Tenho um relacionamento muitos-para-muitos e quero selecionar todos os registros de uma tabela onde pelo menos um elemento do conjunto A apareça no conjunto B. Alguém já passou por algum problema parecido que possa ajudar!?

Ex:

Seria uma coisa mais ou menos assim:

SELECT *
FROM Tabela
WHERE
(SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto A
COMPARADOR(?essa é a dúvida)
(outro SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto B

Olá,

SELECT * FROM conjuntoA A WHERE EXISTS ( SELECT 1 FROM conjuntoB B WHERE B.id = A.id)

Onde “ID” é tua chave primaria ou coluna que queira comparar a existencia no conjunto.

F

ranophoenix:
Ficou assim:

SELECT *
FROM Tabela
WHERE EXISTS (
(SELECT com várias linhas para uma coluna como resultado) //Seria o conjunto A
INTERSECT
(outro SELECT com várias linhas para uma coluna como resultado) )//Seria o conjunto B

Isto é, se pelo menos um elemento do conjunto A for igual a um elemento do conjunto B, então exiba o registro. E agora um desafio:

E se eu quiser exibir um registro se, e somente se, o conjunto A for igual ao conjunto B.

Até mais.

Olá,

Faz igual ao SELECT que postei no outro exemplo, mas compara todos as colunas necessarias.

]['s

C

Não sei se entendí o que vc quis dizer, mas no Oracle:

[]'s

F

chicobento:

Não sei se entendí o que vc quis dizer, mas no Oracle:

[]'s

Olá,

Esta consulta da o mesmo efeito usando a clausula EXISTS, a diferenca é que o IN é muito menos eficiente. Recomendo usar somente em casos onde nao de pra utilizar outra saida.

]['s

ranophoenix

Na realidade o INTERSECT em conjunto com o exists funcionou do jeito que eu estava esperando. Com o IN recebo um erro, pois a minha query da esquerda retorna um conjunto de dados, e não uma única linha, e como o operado IN é para comparação de elemento com conjunto dá pau. Se eu tivesse certeza de que a query da esquerda retornasse somente uma linha sem dúvida usaria o IN, mas o relacionamento é de muitos-para-muitos e a comparação é a nível de chave estrangeira e não primária. Mas vou meditar mais sobre o assunto. :roll:

B

Ola galera,
Estou com uma duvida em consulta no sql, sou iniciante com sql meu conhecimento pouco, gostaria que ajudassem.

Tenho a seguinte tabela

Preciso verificar o código do produto mais vendido, alguém pode me dar uma ideia de por onde começar?

Grato desde já,
Bolivar Amâncio Neto

Criado 26 de março de 2005
Ultima resposta 22 de jan. de 2012
Respostas 11
Participantes 6