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
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.
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!
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.
Select duplo não resolveria seu problema ?
[quote=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[/quote]
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.
[quote=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.[/quote]
Olá,
Faz igual ao SELECT que postei no outro exemplo, mas compara todos as colunas necessarias.
]['s
Não sei se entendí o que vc quis dizer, mas no Oracle:
[]'s
[quote=chicobento]
Não sei se entendí o que vc quis dizer, mas no Oracle:
[]'s[/quote]
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
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:
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