Comparando conjuntos em sql  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
ranophoenix
JavaEvangelist
[Avatar]

Membro desde: 28/02/2004 22:49:47
Mensagens: 389
Offline

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
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.


[WWW]
ranophoenix
JavaEvangelist
[Avatar]

Membro desde: 28/02/2004 22:49:47
Mensagens: 389
Offline

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
JavaEvangelist
[Avatar]

Membro desde: 28/02/2004 22:49:47
Mensagens: 389
Offline

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
JavaEvangelist
[Avatar]

Membro desde: 22/09/2002 13:16:11
Mensagens: 479
Localização: Fortal-CE
Offline

Select duplo não resolveria seu problema ?

"...Em verdade Elias virá primeiro e restaurará todas as coisas." MT:17-11
http://www.google.co.il/search?q=java&hl=iw&lr=lang_iw&start=30&sa=N
ranophoenix
JavaEvangelist
[Avatar]

Membro desde: 28/02/2004 22:49:47
Mensagens: 389
Offline

Como assim????
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

ranophoenix wrote: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á,



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

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

ranophoenix wrote: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

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
chicobento
JavaGuru
[Avatar]

Membro desde: 14/06/2004 01:44:04
Mensagens: 226
Localização: Campinas
Offline

ranophoenix wrote: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.


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



[]'s

SCEA 5
[MSN]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

chicobento wrote:
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

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
ranophoenix
JavaEvangelist
[Avatar]

Membro desde: 28/02/2004 22:49:47
Mensagens: 389
Offline

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.
BolivarAmancio
Smalltalk

Membro desde: 31/08/2011 08:56:07
Mensagens: 4
Offline

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
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team