DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
jose antonio toledo dias
 

País: Brasil
Estado: MG
Cidade: Belo Horizonte
Mensagens: 1
 Postado em: 7/10/2011 2:55:08 PM

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?
Marco Pinheiro
 
 


País: Brasil
Estado: MG
Cidade: Belo Horizonte
Mensagens: 110
 Postado em: 15/12/2011 4:00:04 PM
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.

 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03