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

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





    1 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Diego Da Silva Monte
Foi uma cópia do livro do Celso Henrique Poderoso de Oliveira - SQL Curso Prático mas está valendo disponibilizar este conhecimento.
[há +1 mês] - Responder

 



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
Rubens Antunes

Programador Delphi desde de 2004 e Autor do Livro Delphi - Faça Uma Aplicação Comercial


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03