Subquery de múltiplas colunas
Veja Nesta Quick Subquery de múltiplas colunas
Introdução ao Sql
Alguns bancos de dados permitem realizar a busca em múltiplas colunas utilizando uma subquery.
A primeira técnica consiste em colocar as colunas unidas na cláusula WHERE do SELECT externo e realizar a busca no SELECT interno dessas colunas unidas da mesma forma. Essa técnica tende a ser muito lenta, mas pode ser feita em qualquer banco de dados.
Temos vários CDs indicados no cadastro e queremos conhecer os dados do CD dentre os menores CDs indicados de cada gravadora. Para isso, temos que saber o menor CD indicado de cada gravadora. Observe que tivemos que unir as duas colunas com || .
select codigo_gravadora || min(cd_indicado) from cd
group by codigo_gravadora
Agora devemos realizar a busca dos dados dos CDs que atendem a essa característica:
select codigo_cd, nome_cd, codigo_gravadora, cd_indicado from cd
where codigo_gravadora || cd_indicado in (15,21,31)
Note como a combinação das colunas CODIGO_GRAVADORA e CD_INDICADO é a mesma do comando SELECT anterior. Agora veremos tudo num único comando:
select codigo_cd, nome_cd, codigo_gravadora, cd_indicado from cd
where codigo_gravadora || cd_indicado in
(select codigo_gravadora || min(cd_indicado) from cd
group by codigo_gravadora)
NULL
Quando um SELECT interno contiver valores nulos, não deve ser utilizado NOT IN como operador de comparação. Isso porque qualquer comparação com nulo retorna valor nulo. Exemplo: em nosso cadastro, temos um CD (código 3) que não tem CD indicado. No SELECT a seguir não há problema, pois é utilizado o operador IN:
select codigo_cd, nome_cd, cd_indicado from cd
where cd_indicado in (select cd_indicado from cd)
Quando é utilizado o operador NOT IN, nada é retornado:
select codigo_cd, nome_cd, cd_indicado from cd
where cd_indicado not in (select cd_indicado from cd)
Subquery na cláusula FROM
Podemos utilizar uma subquery na cláusula FROM de um comando SELECT. Essa estrutura não está disponível para todos os bancos de dados, mas faz parte do padrão SQL.
A utilização é muito parecida com as visões. Uma subquery na cláusula FROM define a fonte de dados para esse SELECT em particular. Imagine que desejemos extrair o nome do CD, o seu preço de venda e o preço médio da gravadora, e o preço médio da gravadora é extraído por uma subquery na própria cláusula FROM. Veja como ficaria:
select a.nome_cd, a.preco_venda, b.preco_medio from cd a,
(select codigo_gravadora, avg(preco_venda) from cd
group by codigo_gravadora) b
where a.codigo_gravadora = b.codigo_gravadora and
a.preco_venda > b.preco_medio
Veja que foi substituída a segunda tabela da cláusula FROM por um comando SELECT e que a tabela recebeu o apelido de b nesse comando. Depois, comparamos o código da gravadora de a (CD da cláusula FROM) com b (subquery) e foi dada a condição de que o preço de venda deve ser maior que o preço médio. Observe que foi criada uma coluna virtual, resultado da média de preço de venda, no SELECT interno, e foi possível compará-la na cláusula WHERE do SELECT externo.
Conclusão: Podemos trabalhar de diversas formas uma subquery, assim podemos ter um resultado melhor e com apenas um SELECT, sem precisarmos fazer vários SELECTs, fico por aqui e até o próximo artigo.
Autor:Rubens Antunes
Autor do Livro: Delphi Faça Uma Aplicação Comercial

Space do autor



0
0
