Clique abaixo para nos ajudar
Conectar-se

Esqueci minha senha

Estamos no Facebook
Buscar
 
 

Resultados por:
 


Rechercher Busca avançada

Quem está conectado
23 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 23 Visitantes :: 2 Motores de busca

Nenhum

[ Ver toda a lista ]


O recorde de usuários online foi de 468 em 1/3/2012, 10:43
TRY BEGIN E FLOCK()

17/4/2017, 10:32 por AJC

Pessoal estou tendo alguns problemas de gravação em rede, estou usando
try begin, mas vi algo na …

Comentários: 0

Exportar Dados Campo Memo Tabela DBF

10/4/2017, 10:28 por fcampos

Olá bom dia.

Estou tentando exportar os dados de algumas tabelas em formato dbf pelo foxpro.
O …

Comentários: 2

Função EVL()

8/4/2017, 12:18 por Clebervfp

Bom dia a todos.
Vim compartilhar de uma Função do próprio VFP que me benefício muito.
Função …

Comentários: 0

COMO BLOQUEAR REGISTRO OU TABELA NO VISUAL FOXPRO PARA GRAVAÇÃO EM REDE

3/4/2017, 10:29 por AJC

Pessoal estou tendo um problema que acontece sempre busco na minha tabela de clientes o ultimo …

Comentários: 2

Controlar Scanner Twain

31/3/2017, 17:31 por Kleber R Bento

Estou usando o EZTW32.DLL para criar uma ferramenta que escaneia e gera PDF. Porém com esses …

Comentários: 0

Estatísticas
Temos 7065 usuários registrados
O último usuário registrado atende pelo nome de Cauby

Os nossos membros postaram um total de 48 mensagens em 25 assuntos

SUB QUERY - SQL SERVER

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial SUB QUERY - SQL SERVER

Mensagem por Sub-Zero em 21/12/2011, 11:44

Acho que a Fonte desse conteudo
é uma coluna no Imasters de perguntas e respostas

uma subquery nada mais é do que um query dentro da outra. Como veremos a seguir, elas podem ser utilizadas para quebrar uma query complexa em uma série de passos lógicos, mais fáceis de se entender.

Neste primeiro exemplo vou mostrar como podemos colocar uma subquery no lugar de uma coluna que será retornada na instrução SELECT:

Código:
SELECT C1 , ( SELECT C2 FROM T2 ) AS C2 , C3
FROM T1
No exemplo acima, as coluna C1 e C3 pertencem à tabela T1 e o campo C2 é um campo calculado através de uma subquery. A subquery obtém o campo C2 da tabela T2.

Aqui já podemos observar alguns pontos importantes. O primeiro deles é que sempre devemos colocar uma subquery entre parênteses, pois assim o SQL Server consegue saber que estamos nos referindo a uma subquery.

Outro ponto importante é que mesmo se a tabela T2 (a que está sendo utilizada na subquery) possuir mais de um campo , somente poderemos retornar um campo , pois a query mais externa somente irá receber o conteúdo de um campo. Também podemos perceber que não correlacionamos de nenhuma maneira a tabela T2 com a tabela T1.

Poderíamos também utilizar o resultado de uma subquery na cláusula WHERE da instrução SELECT como no exemplo abaixo:

Código:
SELECT PROD_COD , PROD_PRC
FROM PRODUTOS
WHERE PROD_PRC = ( SELECT MAX(PROD_PRC) FROM PRODUTOS )

Primeiramente o que a instrução SELECT mais interna faz é retornar o preço máximo de todos o produtos da tabela PRODUTOS, através da função de agregação MAX(). Feito isto, este valor é comparado com todos os produtos e somente aqueles que possuírem o valor máximo serão retornados pela query mais externa.

Com as subquery’s também podemos retornar uma lista de valores, dependendo de qual operador utilizarmos. Abaixo mostro alguns exemplos comentados:

/* Aqui somente trago os clientes que fizeram compras antes da data atual */
Código:
SELECT CLI_COD , CLI_NOME
FROM CLIENTES
WHERE CLI_COD
IN( SELECT CLI_COD FROM PEDIDOS WHERE PED_DATA < GETDATE() )

/* Aqui trago todos os clientes somente se qualquer cliente já fez algum pedido.*/
Código:
SELECT CLI_COD , CLI_NOME
FROM CLIENTE
WHERE EXISTS ( SELECT CLI_COD FROM PEDIDO )

Para os exemplos vistos até agora não nos preocupamos em correlacionar as tabelas que são utilizadas tanto na query mais interna (subquery) como na mais externa (a query final). Para fazer isto, devemos primeiramente dar uma alias para cada tabela e fazer a relação entre estes alias na subquery pois os alias da query mais externa são ‘enxergados’ na query mais interna. Exemplo:

Código:
SELECT P.PED_COD , P.PED_DATA , P.COD_CLI ,
FROM PEDIDO AS P
WHERE P.COD_CLI
IN ( SELECT C.COD_CLI FROM CLIENTE C WHERE P.COD_CLI = C.COD_CLI )

No exemplo acima estamos filtrando a tabela PEDIDO de acordo com a relação feita através da coluna COD_CLI tanto da tabela PEDIDO como da tabela CLIENTE. Perceba que utilizamos os alias P e C para identificar as tabelas, pois ambas possuem uma coluna COD_CLI.

Agora observem a query abaixo:

Código:
SELECT P.PED_COD , P.PED_DATA
, P.COD_CLI
, ( SELECT C.NOM _CLI FROM CLIENTE C WHERE P.COD_CLI = C.COD_CLI ) AS NOME_CLI
FROM PEDIDO AS P

Nesta query estamos retornando o campo NOM_CLI da tabela CLIENTE. Porém, não estamos filtrando a tabela PEDIDO de modo que se houver algum COD_CLI na tabela PEDIDO que não se encontre na tabela CLIENTE o valor NULL será retornado para o campo NOME_CLI calculado através da subquery.

Alguns detalhes quando utilizarmos subquery’s:

1. Sempre feche as subquey’s com parênteses para que as mesmas funcionem corretamente

2. Subquery’s não podem trabalhar com colunas quem contém o tipo de dados TEXT ou IMAGE. Uma idéia é converter estes dados para outro tipo ( como VARCHAR ) através das funções CONVERT() ou CAST() e depois retorná-los na subquery. Exemplo:

Código:
SELECT COD ,
( SELECT CAST( TXT AS VARCHAR ) FROM BLOB ) AS X
FROM BLOB

3. Sempre que possível procure montar a Subquery antes de colocá-las na instrução SELECT final. Isto ajuda a dividir uma instrução SELECT complexa em pequenos passos. Após obter a subquery correta, coloque-a na query oficial lembrando sempre que para cada registro da query mais externa, a subquery vai ser executada uma vez.

4. Caso precisar correlacionar a subquery interna com a query externa e tanto a query como a subquery utilizarem a mesma tabela, procure colocar um alias para a tabela diferente em cada uma. Por exemplo:

Código:
SELECT T1_A.C3 ,
( SELECT T1_B.C3 FROM TABELA1 AS T1_B WHERE T1_A.C1 = T1_B.C2 ) AS CALCULADO
FROM TABELA1 AS T1_A

5. Quando a instrução SELECT que possuir a subquery ficar muito grande, pense em criar uma view. Desta maneira a complexidade da query ficará encapsulada e o usuário final somente utilizará a view.

6. Subquery’s geralmente podem ser convertidas em joins. Por exemplo, a query:

Código:
SELECT * FROM TABELA1
WHERE ID IN ( SELECT ID FROM TABELA2 )

Pode ser convertida para

Código:
SELECT TABELA1.* , TABELA2.*
FROM TABELA1 , TABELA2
WHERE
TABELA1.ID = TABELA2.ID

Ou ainda

Código:
SELECT TABELA1.* , TABELA2.*
FROM TABELA1 INNER JOIN TABELA2
ON
TABELA1.ID = TABELA2.ID

As três query´s acima são equivalentes , sendo preferível a última. Outro exemplo: as duas query’s abaixo

Código:
SELECT * FROM TABELA1
WHERE ID NOT IN ( SELECT ID FROM TABELA2)

e

Código:
SELECT * FROM TABELA1
WHERE NOT
EXISTS ( SELECT ID FROM TABELA2 WHERE TABELA1.ID = TABELA2.ID )

São equivalentes à seguinte query:

Código:
SELECT TABELA1.*
FROM TABELA1 LEFT OUTTER JOIN TABELA2
ON TABELA1.ID = TABELA2.ID
WHERE TABEL2.ID IS NULL

É preferível que utilizemos um join ao invés de uma subquery, quando possível, pois o Query Otimizer (o mecanismo que otimiza as instruções enviada para o banco) pode executar algumas operações a mais quando se utiliza subquery’s, degradando assim a performance da execução.


Sub-Zero
Participa Bastante
Participa Bastante


Voltar ao Topo Ir em baixo

Tutorial Re: SUB QUERY - SQL SERVER

Mensagem por Marcos Guedes em 30/12/2011, 18:19

Ótima iniciativa!
Parabéns!

_________________
Marcos Guedes - Programador e desenvolvedor Web.


Visite o nosso portal:
[Você precisa estar registrado e conectado para ver este link.]

Marcos Guedes
Webmaster
Webmaster


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum