Ajuda sobre SQL

MySQL

06/07/2016

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
Bruna Silva

Bruna Silva

Curtidas 0

Melhor post

Marcos P

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 )...

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
POSTAR