Analise o comando a seguir. SELECT * FROM T1 FULL OUTER JOIN T2 ON T1.A=T2.A Sabe-se que a coluna A foi definida como chave primária tanto em T1 como em T2, e que T1 e T2 contêm, respectivamente, 20 e 30 linhas. Assinale a opção que apresenta a estimativa do número de linhas produzidas pela execução do comando acima.
- A)20, exatamente.
Errada, porque o FULL OUTER JOIN nao devolve necessariamente apenas as linhas de uma das tabelas; ele pode somar registros sem correspondencia dos dois lados.
- B)30, exatamente.
Errada, pois 30 seria o minimo apenas se todas as linhas de T1 coincidissem com T2, e isso nao pode ser afirmado com os dados dados.
- C)600, exatamente.
Errada, porque 20 x 30 nao gera produto cartesiano aqui; existe condicao de junção por chave primaria, entao nao ha multiplicacao desse tipo.
- D)Entre 20 e 30.
Errada, porque o resultado nao fica limitado entre 20 e 30; com FULL OUTER JOIN entram tambem as linhas sem par, podendo chegar acima de 30.
- E)Entre 30 e 50.
Certa, pois o resultado de um FULL OUTER JOIN entre chaves primarias fica entre 30 e 50 linhas, dependendo de quantas chaves coincidem.
Gabarito: E
No FULL OUTER JOIN, voce traz para o resultado tanto os registros que casam quanto os que nao casam, dos dois lados. Como a coluna A e chave primaria em T1 e em T2, cada valor de A aparece no maximo uma vez em cada tabela, entao nao existe multiplicacao de linhas por repeticao do mesmo valor. Isso e importante: aqui nao e um "1 para muitos", e sim um encontro de conjuntos com chaves unicas. Pense assim: T1 tem 20 linhas e T2 tem 30 linhas. Se alguns valores de A aparecem nas duas tabelas, essas linhas viram uma so no resultado. Se nao aparecem, cada linha fica preservada com NULL do outro lado. Logo, o total fica entre 30 e 50: o minimo ocorre se todas as 20 linhas de T1 tiverem correspondente em T2, e o maximo ocorre se nao houver nenhuma coincidencia. A conta intuitiva e: total = 20 + 30 - coincidencias. Como as coincidencias podem variar de 0 ate 20, o resultado varia de 50 ate 30. Por isso a unica opcao possivel e "entre 30 e 50". Na pratica, a banca explora a diferenca entre JOIN comum e FULL OUTER JOIN. O primeiro pode reduzir ou manter o numero de linhas conforme a cardinalidade; o segundo preserva tudo dos dois lados e so elimina duplicidade quando ha chave igual dos dois lados.