Questão de banco de dados

07/10/2011

0

Em um banco de dados relacional, as tabelas T1e T2 possuem
10 e 20 tuplas, respectivamente. Suponha que ambas possuam
um atributo A que representa uma grandeza quantitativa e que 5
tuplas de T2 não possuam valor informado para esse atributo.
Nesse caso, assinale a alternativa que corresponda ao resultado
produzido pelo seguinte comando SQL:
SELECT COUNT(d.A)
FROM T1 AS a, T1 AS b, T2 AS c, T2 AS d;
(A) 40000
(B) 30000
(C) 22500
(D) 4000
(E) 3000

Qual seria a resposta da questão acima?
Jose Dias

Jose Dias

Responder

Posts

15/12/2011

Marco Pinheiro

Bom, Pelo que você informa acredito que a estrutura seria essa:

create table t1 (a int)
create table t2 (a int)

insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (4)
insert into t1 values (5)
insert into t1 values (6)
insert into t1 values (7)
insert into t1 values (8)
insert into t1 values (9)
insert into t1 values (10)

insert into t2 values (1)
insert into t2 values (2)
insert into t2 values (3)
insert into t2 values (4)
insert into t2 values (5)
insert into t2 values (6)
insert into t2 values (7)
insert into t2 values (8)
insert into t2 values (9)
insert into t2 values (10)
insert into t2 values (11)
insert into t2 values (12)
insert into t2 values (13)
insert into t2 values (14)
insert into t2 values (15)
insert into t2 values (null)
insert into t2 values (null)
insert into t2 values (null)
insert into t2 values (null)
insert into t2 values (null)

Fazendo a consulta:
SELECT COUNT(d.a)
FROM T1 AS a, T1 AS b, T2 AS c, T2 AS d

Temos como resultado 30000 linhas.

O grande detalhe está em SELECT COUNT(d.a). Se você perceber, o campo está sendo referenciado pela tabela D.
Então o SQL faz a seguinte conta:

FROM T1 AS a, T1 AS b , T2 AS c, T2 AS d
10 linhas , 10 linhas, 20 linhas, 15 linhas, assim: 10*10*20*15 = 30000

Se você mudar a tabela no COUNT terá outro resultado. Pois quando o SQL faz este tipo de plano cartesiano ele ignora os valores nulos da tabela selecionada, por isso os 15 registros ao invés de 20.

Para um outro entendimento considere esta consulta:


SELECT *
FROM T1 AS a, T1 AS b, T2 AS c, T2 AS d

O SQL trará 40000, porque ele faz: 10*10*20*20

Agora considere a consulta:

SELECT *
FROM T1 AS a, T1 AS b, T2 AS c, T2 AS d
where d.a is null

Você terá o resultado de 10000 linhas. Em outras palavras, ele faz 40000 - 10000 linhas nulas = 30000.

Att.,

Marco.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar