Ajuda sobre SQL
Pessoal essa questão caiu na prova, sendo que não consegui resolver. Alguém pode me ajudar explicando como chegar a resposta, por favor?
Questão:
Considere a tabela A abaixo, seus campos VALOR e DADO, e a consulta em linguagem SQL.
A
-------------------
VALOR DADO
--------- ---------
1 10
3 20
6 50
8 40
9 30
10 20
12 10
SELECT SUM (A.VALOR) FROM A WHERE EXISTS (SELECT * FROM A as B WHERE (A.VALOR/B.DADO)>=1);
Teremos o retorno da consulta em SQL:
a) 10
b) 14
c) 16
d) 22
e) 31
Questão:
Considere a tabela A abaixo, seus campos VALOR e DADO, e a consulta em linguagem SQL.
A
-------------------
VALOR DADO
--------- ---------
1 10
3 20
6 50
8 40
9 30
10 20
12 10
SELECT SUM (A.VALOR) FROM A WHERE EXISTS (SELECT * FROM A as B WHERE (A.VALOR/B.DADO)>=1);
Teremos o retorno da consulta em SQL:
a) 10
b) 14
c) 16
d) 22
e) 31
Bruna Silva
Curtidas 0
Melhor post
Marcos P
07/07/2016
Bruna,
A resposta é 22 e minha interpretação desse cenário é...
Quando você faz SELECT ... FROM A WHERE EXISTS (SELECT ... FROM A....), o mySQL ( assim como qualquer outro gerenciador relacional ) vai gerar um PRODUTO CARTESIANO da tabela com ela mesma.
Isso significa que serão geradas todas as combinações possíveis das ocorrências da tabela, ou seja, 7x7 ( 49 linhas )...
Aplicando a condição da subquery ( WHERE (A.VALOR/B.DADO)>=1 ) nessas linhas, quatro combinações retornam válidas...
Observe, contudo, que na tabela de origem somente os pares 10 20 e 12 10, existem efetivamente ( pois as demais combinações, a parte "B", acabam não afetando a query principal ).
Sendo assim, o gerenciador de banco de dados recupera na tabela original :
Outra maneira de lhe explicar isso aí, é você assumir a instrução abaixo...
Onde :
1. INNER JOIN ON (A.ID = B.ID) or (A.ID <> B.ID) : simula o produto cartesiano gerando as 49 linhas combinadas
2. SELECT DISTINCT : recupera apenas as ocorrências válidas na tabela de origem
É uma questão interessante, pois foge um pouco do modelo padrão de relacionamento que normalmente utilizamos no dia-a-dia.
Espero que minha explicação lhe seja útil.
A resposta é 22 e minha interpretação desse cenário é...
Quando você faz SELECT ... FROM A WHERE EXISTS (SELECT ... FROM A....), o mySQL ( assim como qualquer outro gerenciador relacional ) vai gerar um PRODUTO CARTESIANO da tabela com ela mesma.
Isso significa que serão geradas todas as combinações possíveis das ocorrências da tabela, ou seja, 7x7 ( 49 linhas )...
ValorA DadoA ValorB DadoB ----------- ----------- ----------- ----------- 1 10 1 10 1 10 3 20 1 10 6 50 1 10 8 40 1 10 9 30 1 10 10 20 1 10 12 10 3 20 1 10 3 20 3 20 3 20 6 50 3 20 8 40 3 20 9 30 3 20 10 20 3 20 12 10 6 50 1 10 6 50 3 20 6 50 6 50 6 50 8 40 6 50 9 30 6 50 10 20 6 50 12 10 8 40 1 10 8 40 3 20 8 40 6 50 8 40 8 40 8 40 9 30 8 40 10 20 8 40 12 10 9 30 1 10 9 30 3 20 9 30 6 50 9 30 8 40 9 30 9 30 9 30 10 20 9 30 12 10 10 20 1 10 10 20 3 20 10 20 6 50 10 20 8 40 10 20 9 30 10 20 10 20 10 20 12 10 12 10 1 10 12 10 3 20 12 10 6 50 12 10 8 40 12 10 9 30 12 10 10 20 12 10 12 10
Aplicando a condição da subquery ( WHERE (A.VALOR/B.DADO)>=1 ) nessas linhas, quatro combinações retornam válidas...
ValorA DadoA ValorB DadoB ----------- ----------- ----------- ----------- 10 20 1 10 10 20 12 10 12 10 1 10 12 10 12 10
Observe, contudo, que na tabela de origem somente os pares 10 20 e 12 10, existem efetivamente ( pois as demais combinações, a parte "B", acabam não afetando a query principal ).
Sendo assim, o gerenciador de banco de dados recupera na tabela original :
VALOR DADO ----------- ----------- 10 20 12 10
Outra maneira de lhe explicar isso aí, é você assumir a instrução abaixo...
SELECT DISTINCT A.VALOR, A.DADO FROM A A INNER JOIN A B ON (A.ID = B.ID) or (A.ID <> B.ID) WHERE ((A.VALOR/B.DADO)>=1) ORDER BY A.VALOR
Onde :
1. INNER JOIN ON (A.ID = B.ID) or (A.ID <> B.ID) : simula o produto cartesiano gerando as 49 linhas combinadas
2. SELECT DISTINCT : recupera apenas as ocorrências válidas na tabela de origem
É uma questão interessante, pois foge um pouco do modelo padrão de relacionamento que normalmente utilizamos no dia-a-dia.
Espero que minha explicação lhe seja útil.
GOSTEI 1