quinta-feira, 2 de setembro de 2010
Busca  
Porta 80 Web Hosting
 :: Acessibilidade
Ir para conteúdo principal: ALT + 1
 :: Participe
Seja um autor de CD/DVD de Treinamento
Publique um artigo
Publique uma oportunidade
Publique uma notícia
Publique um curso
Publique uma dica
Publique um código
 :: Informativo
Receba nossos informativos por e-mail.
E-mail:   
 
Digite a palavra abaixo:  
 
 
 :: Oportunidades
Cadastrar oportunidades
Gerenciar suas oportunidades
Cadastrar nova empresa
 :: Especiais
Básico de C++
C++ Builder
Curso ASP.NET 3.5 em VB.NET e C#
Guia Prático de HTML
Testes com Visual Studio Team System 2008
 :: Desenvolvimento
ActionScript
ADO.NET
ASP
ASP.NET
Automação Comercial
C#
C/C++
Coldfusion
CSS
Delphi
Disp. Móveis
HTML
Java
Javascript
LSL (Second Life)
Modelagem
PHP
Python
Sharepoint
Silverlight
SQL
VBA (Office)
Visual Basic
Visual Basic .NET
Visual Fox Pro
WCF/WPF
Web Services
XML
 :: Infra
BizTalk Server
CRM
Exchange Server
ForeFront / Antigen / IAG
Interoperabilidade
ISA Server
Linux
MOF
MS Dynamics CRM
Network
OCS / LCS
Outlook
Powershell e Scripts
Redes
Segurança
System Center e Gerenciamento
Virtualização
Windows
Windows Server
 :: Banco de Dados
Access
Caché
Firebird
Interbase
MySQL
Oracle
SQL Server
Sybase
 :: Gerência
Arquitetura
Ciclo de Vida de Desenvolvimento
Controle de Versão
Estimativas
Metodologias
MOF
Qualidade e Testes
 :: Design
Corel
Flash
Photopaint
Photoshop
 :: Livros
Análise Sistemas
Aplicativos
Banco de Dados
Certificação
Design e CAD
Gerência
Hardware
Internet
Programação
Programação Web
Rede
Segurança
Servidores
Sistemas Operacionais
 :: CDs/DVDs
Desenvolvimento
Infra
Design
 :: E-Books
.NET 2.0 (VS 2005)
.NET 1.1 (VS 2003)
SQL Server
Excel 2007
Excel 2003
Access 2003
ASP 3.0
Delphi
Java
Artigos
Utilizando queries recursivas no SQL Server 2005
Por: Half Scheidl
[Entre em contato com o autor ]
Engenheiro da Computação pela Escola Politécnica da USP, trabalha como consultor de Business Intelligence na Arbit (www.arbit.com.br).
Feed de artigos.
Feed de artigos deste autor.
Gere seu feed personalizado  

Utilizando queries recursivas no SQL Server 2005
Publicado em: 08/06/2007

Introdução

 

Entre os  novos recursos do SQL Server 2005, estão as Common Table Expressions (CTE), uma forma de definir uma view, válida apenas no escopo do batch atual. Sua sintaxe resumida é a seguinte:

 

WITH [name] AS (

     [instrução SELECT]

)

 

Com este recurso, é possível simplificar queries mais complexas e torná-las mais legíveis, eliminando sub-queries, por exemplo, ou ainda solucionar problemas de maneira modular, isto é, iniciando pelas partes mais simples. No caso de mais de uma CTE’s por consulta, a segunda pode incluir a primeira em sua cláusula FROM, e assim por diante.

Neste artigo, o objetivo é explorar a utilização de CTE’s para buscas em estruturas hierárquicas, baseadas em tabelas com auto-referenciamento, do tipo Id/ParentId.

 

Recursividade

Recursão é a chamada de uma função por ela mesma. O exemplo clássico de recursão é o cálculo do fatorial de um número natural:

 

Código 1 – Pseudo-código: cálculo do fatorial de um número n

 

int Fatorial (int n) {

   if (n==1)

       return 1;

   else

       return n * Fatorial(n-1);

}

 

 

Dado um número n, a rotina calcula n * (n – 1) * (n-2) * ... 1. Como exemplo, o fatorial de 4, cuja notação matemática é 4!, é dado por 4 * 3 * 2 * 1 = 24. Vale notar que esta solução para o cálculo de fatorial não é a melhor em termos computacionais, mas este assunto fica para depois...

Consultas recursivas

 

No SQL Server 2005, é possível escrever CTE’s que fazem referência a si próprias, incluindo seu nome numa cláusula FROM.  Uma das aplicações é a construção de consultas simples para estruturas relacionais hierárquicas, como uma tabela de funcionários com um auto-relacionamento definindo os subordinados. A aplicação em que se baseia este artigo é a hierarquia de produtos de uma empresa de semi-condutores.

 

Para utilização de uma query recursiva, a CTE deve possuir duas intruções SQL, separadas obrigatoriamente por UNION ALL, sendo a primeira chamada de “âncora”, isto é, a primeira consulta define o ponto de entrada na hierarquia.  A segunda consulta inclui o nome da CTE em sua cláusula FROM. Tal estrutura está exemplificada no Código 2.

 

Código 2 – Estrutura básica de uma query recursiva

 

WITH Filhos AS (

    -- Membro âncora

    SELECT IdHierarquia, IdHierarquiaPai, Descricao

    FROM   [Tabela de Hierarquia]

    WHERE  Descricao = 'NONONO'

    UNION ALL

    -- Filhos

    SELECT h.IdHierarquia, h.IdHierarquiaPai, h.Descricao

    FROM   [Filhos] t1

    INNER JOIN [Tabela de Hierarquia] t2 ON t1.IdHierarquiaPai = t2.IdHierarquia

)

SELECT * FROM Filhos

 

 

 

É possível limitar o número de recursões na query, evitando loops infinitos, através do parâmetro option (maxrecursion n), incluído após a última instrução. Quando não informado, o valor padrão para o limite de recursões é 100. Caso uma query exceda esse limite, é retornado o erro abaixo, substituindo [n] pelo número definido com o parâmetro maxrecursion.

 

The statement terminated. The maximum recursion [n] has been exhausted before statement completion.


Modelo de dados

 

O modelo de dados assumido para este artigo foi baseado no caso real citado, considerando apenas os dados relevantes ao artigo.

A estrutura de produtos é armazenada em duas tabelas, Produtos e HierProdutos. A primeira lista todos os produtos, com suas descrições físicas, e a segunda agrupa estes produtos em hierarquias.

 

O Código 3 pode ser utilizado para criar as tabelas utilizadas.

 

Código 3 – Instrução DDL para criação das tabelas

 

CREATE DATABASE DbArtigo;

GO

 

USE DbArtigo;

 

CREATE TABLE HierProdutos (

   IdHierarquia    INT PRIMARY KEY,

   IdHierarquiaPai INT CONSTRAINT fk_HierProdutos FOREIGN KEY REFERENCES HierProdutos (IdHierarquia),

   Descricao       VARCHAR(100)

)

 

CREATE TABLE Produtos (

   IdProduto     INT PRIMARY KEY,

   IdHierarquia  INT CONSTRAINT fk_Produtos_HierProdutos FOREIGN KEY REFERENCES HierProdutos (IdHierarquia),

   CodProduto    VARCHAR(100),

   DescricaoProd VARCHAR(100)

)

 

 

As tabelas abaixo apresentam uma lista de hierarquias e produtos, para exemplificar o contexto de negócio. Nos itens seguintes, apresentam-se alguns problemas para o modelo de dados proposto.

 


Tabela 1 – Exemplo para a tabela de Produtos

IdProduto

IdHierarquia

CodProduto

DescProduto

1

9

P101

Processador 101

2

9

P102

Processador 102

3

10

P201

Processador 201

4

10

P202

Processador 202

5

17

P402

Processador 401

6

20

R001

Roteador 001

7

14

M001

Memória 1GB

8

8

M0012

Memória 512MB

9

8

M0013

Memória 512MB DDR2

 

Tabela 2 – Exemplo para a tabela Hierarquia de Produtos

IdHierarquia

IdHierarquiaPai

Descricao

1

NULL

Desktop

2

NULL

Servidores

3

NULL

Equipamentos de Rede

4

1

Placa-mãe

5

1

Placa de rede

6

1

Processador

7

1

Placa de Vídeo

8

1

Memória

9

6

Processador núcleo simples

10

6

Processador núcleo duplo

11

2

Placa-mãe

12

2

Placa de rede

13

2

Processador

14

2

Memória

15

13

Processador núcleo simples

16

13

Processador núcleo duplo

17

13

Processador de quatro núcleos

18

3

Roteador

19

3

Switch







 

Inclua um comentário sobre o artigo Topo
Elogios e críticas são muito bem vindos, porém o comentário deve ter referência ao artigo em pauta.
O portal e o autor agradecem.
Nome:    
E-mail:      
Comentários:    
Digite a palavra abaixo:  
Para dúvidas técnicas, NÃO UTILIZE ESTE ESPAÇO, utilize nosso fórum de discussão.
http://linhadecodigo.com.br/cs2/forum
 
Comentários sobre o artigo Ver Todos comentários
Ola FRANCKE!! Sua solucao para o desafio deu resultado, mas porem se voce tiver mais de 10 niveis, nao vai colocar os filhos dentro dos pais correctos...
Quem enviou: Filipe
Postado em: 08/04/2008 00:00:00
Artigo muito bom, muito bem explicado, exemplificado e elucidativo. parabens
Quem enviou: Mauro Costa e Silva
Postado em: 25/06/2007 00:00:00
Achei muito interessante o artigo, ainda mais porque estou começando a implementar uma nova plataforma usando .NET em SQL Server 2005 e as consultas recursivas me criam alternativas que nao havia considerado anteriormente.

Parabéns ao eng.Scheidl pelo otimo artigo!
Quem enviou: Antonio Marques
Postado em: 15/06/2007 00:00:00
Artigo muito util, especialmente para mim que estou apenas começando a me envolver com aspectos técnicos da companhia.
Quem enviou: Roberto Abrahao
Postado em: 15/06/2007 00:00:00
É isso ai cara! Parabéns!
Rodei aqui e está correta também, apesar de não ter ficado igual a minha. Na verdade a minha é bem parecida, daqui um tempo eu posto ela aqui ok?
A maior satisfação é saber que o conhecimento foi passado adiante. Sucesso!
Quem enviou: Half
Postado em: 12/06/2007 00:00:00
oi Half,

Olha eu aqui outra vez!! :-)


Estou desde cedo tentando colocar este seu desafio para funcionar! ;-)

Por sua causa tive que aprender a usar o ROW_NUMBER() e fazer Milhares de pesquisas na internet,mas graças a deus conclui seu desafio!! :-)

Segue abaixo o fonte:


WITH DESAFIO (IDHIERARQUIA, IDHIERARQUIAPAI, DESCRICAO, NIVEL, ESPACO)

AS (

SELECT IDHIERARQUIA, ISNULL(IDHIERARQUIAPAI,IDHIERARQUIA) AS IDHIERARQUIAPAI, DESCRICAO,
CONVERT(VARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY IDHIERARQUIA)) AS NIVEL, 0 AS ESPACO
FROM HIERPRODUTOS WHERE IDHIERARQUIAPAI IS NULL

UNION ALL

SELECT H.IDHIERARQUIA, H.IDHIERARQUIAPAI, H.DESCRICAO,
DESAFIO.NIVEL + ''.'' + CONVERT(VARCHAR(MAX),
(ROW_NUMBER() OVER (ORDER BY H.IDHIERARQUIA))) AS NIVEL,ESPACO+1
FROM HierProdutos H INNER JOIN DESAFIO
ON H.IDHIERARQUIAPAI = DESAFIO.IDHIERARQUIA

)
SELECT IDHIERARQUIA, IDHIERARQUIAPAI,
REPLICATE('' '',ESPACO) + DESCRICAO, NIVEL
FROM DESAFIO
ORDER BY NIVEL


É desta forma que você fiz ou existe outra forma mais fácil de fazer seu desafio ?

Bom, agora vou dormir, acho que já fiquei MUITO tempo na frente deste micro por hoje!!

Obrigado pelo artigo, aprendi MUITO com ele!


[]''s Boa noite!
Quem enviou: FRANCKE
Postado em: 10/06/2007 00:00:00
achei muito bacana seu artigo, agora vou esuta-lo para poder entende-lo melhor!!

parabéns!!! :-)

Quem enviou: FRANCKE
Postado em: 09/06/2007 00:00:00
Outros artigos do autor Topo
  Ainda não existem novos artigos para este autor.
Artigos relacionados Topo
Como migrar dados do SQL Server 2008 R2 para o SQL Azure Database através do SSIS
Tipos de conexões do SSIS no SQL Server 2008 R2
Usando Import and Export Wizard no SQL Server 2008 R2
Como encontrar objetos no SQL Server?
Como calcular a massa de dados no SQL Server?
Self-Join X CTE (Common Table Expression)
Trabalhando com CLR: Stored Procedure – Primeiro passo
Importando e Exportando dados com SQL Server Integration Services
Trabalhando com SQL CLR: Início
Passo a passo para encontrar as querys mais demoradas do Banco de Dados
Dica sobre erro no SQL Server (Senha expirada)
Como criar um Controle de Versão de Procedures, Views e Functions no SQL Server
Criando um CheckList Automático do Banco de Dados
Integrando PowerPivot do SQL Server 2008 R2 com Excel 2010
Comparativo entre o SQL Server e o SQL Azure Database
Gerar XMLs pelo SQL Server
Utilizando File Stream
Utilizando a propriedade Identity Insert e DBCC CHECKIDENT
Criando primeiro DB com SAD (SQL Azure Database) – SQL Server 2008
Conectando ao SAD (SQL Azure Database) – SQL Server 2008
SQL Azure Database (Introdução) – SQL Server 2008
SQLEngine Utilizando Upgrade
Análise de desempenho entre os bancos de dados SQL Sever x Oracle
Uma libertação chamada OLAP
Gerando backup no SqlServer via código - (SqlCommand e DMO)
Função de tratamento de erros (RAISERROR)
Novos tipos de dados date/time no SQL Server 2008
Trabalhando com Linked Server no SQL Server 2005
DMF - Declarative Management Framework no SQL Server 2008
Pivot Table no SQL Server 2000: Criando um cross-tab report
Produtos relacionados Topo
Pacote: Promoção ASP.Net com Banco de Dados (válido somente para pagamento via boleto bancário)
CD/DVD: CD de Treinamento - SQL Server 2005 Reporting Services com Windows Vista Ultimate - Simulados e vídeos
Pacote: Pacote: Explorando banco de dados usando .NET II (3 CDs)
CD/DVD: CD de Treinamento Gerenciando banco de dados usando Visual Studio Team System
E-Book: Banco de dados com C# e Visual Studio .Net 2005 (entrega via download)
CD/DVD: CD de Treinamento Introdução a banco de dados com SQL Server 2005 Express
Livro: Microsoft SQL Server 2005 Express Edition - Interativo: Guia Básico
E-Book: E-Book: SQL Server 2000 - Curso Completo (via download)
Livro: SQL - Guia Prático
Livro: Visual Studio Team System - Team Foundation Server
© Copyright 2001-2010 Codeline Editora, Comércio e Tecnologia Ltda. | Política de privacidade e de uso | Anuncie | Fale conosco

» Site hospedado na Porta 80 Web Hosting «
Nossos números
Dicas: 1.314
Códigos/scripts: 279
Funções de VBScript : 90
Funções JScript : 05
Livros: 1.805
Notícias: 2.623
Artigos: 3.020
Cases: 14
Oportunidades: 4.591
Vídeos .Net: 484
Publicidade

Conheça a loja do Linha de Código.

Microsoft indica Linha de Código.

Assine a Revista Mundo .NET
Portal de Vídeos .NET - os melhores vídeos .NET estão aqui
O que você fará com o Visual Studio 2010?
Revista Codificando .Net

Siga-nos no Twitter

Linha de Código no Orkut
Fórum de discussão do portal Linha de Código
Feeds
Oportunidades
Notícias
Artigos
Artigos personalizado
       (Por assunto)
Artigos personalizado
       (Por autor)
Portal Vídeos .NET
Portal Vídeos Delphi
LC Blog
       (Onde você faz a notícia)
Promoções
Promoção Wordpress + Tabless (válido somente para pagamento via boleto bancário)
Promoção Wordpress + Tabless (válido somente para pagamento via boleto bancário)
De: R$ 149,70
Por: R$ 99,80
Promoção PHP + MYSQL Intelimax (válido somente para pagamento via boleto bancário)
De: R$ 308,00
Por: R$ 219,00
Promoção Especial Infra
De: R$ 175,95
Por: R$ 136,00
Promoção: Portal de Vídeos .Net + CD Novidades das Linguagens (válido somente para pagamento via boleto bancário)
De: R$ 162,00
Por: R$ 89,00
Promoção VSTS (válido somente para pagamento via boleto bancário)
De: R$ 219,00
Por: R$ 146,00
CDs/DVDss
DVD Desenvolvimento de Games - Programando Jogos com o 3D Game Studio
DVD Desenvolvimento de Games - Programando Jogos com o 3D Game Studio
Por: R$ 59,00
DVD Curso de CorelDraw X4
Por: R$ 79,90
DVD Curso de Fireworks CS4
Por: R$ 49,90
DVD Curso de Indesign CS4
Por: R$ 55,00
DVD Curso de Efeitos Digitais
Por: R$ 49,90
Livros
MSProject 2007 - Metodologia e Critérios de Qualidade para o Gerenciamento de Projetos
MSProject 2007 - Metodologia e Critérios de Qualidade para o Gerenciamento de Projetos
De: R$ 129,00
Por: R$ 77,40
Foundation FLASH CS3 para Designers
Ciência Moderna
De: R$ 139,00
Por: R$ 83,40
ALGORITMOS O Guia Essencial
Alta Books
De: R$ 64,90
Por: R$ 58,40
Treinamento Prático em Dreamweaver
Digerati Books
Por: R$ 14,95
Estudo Dirigido de Adobe Photoshop CS4 em português - Para Windows
Erica
De: R$ 88,00
Por: R$ 74,80
E-Books
Manual Completo de Estudos MCSE 70-270 - Instalando, Configurando e Administrando o Windows XP (506 páginas) - Entrega via download
Manual Completo de Estudos MCSE 70-270 - Instalando, Configurando e Administrando o Windows XP (506 páginas) - Entrega via download
Por: R$ 30,00
Manual de Estudos - Exame 70-291 - Windows Server 2003 (606 páginas) - entrega via download
Por: R$ 30,00
Dominando MS – Visio ® em 20 Passos - Melhores Práticas em Gestão de Projetos (entrega via download)
Por: R$ 30,00
MS-Project® 2007 - Melhores Práticas de Gestão de Projetos - Dominando MS – Project ® em 20 Passos (e-book com entrega via download)
Por: R$ 20,00
Banco de dados com C# e Visual Studio .Net 2005 (entrega via download)
Por: R$ 20,00
Os 10+ | Autores do dia
Israel Aéce
Júlio Cesar Fabris Battisti
Anderson Patricio
Luiz Felipe de Freitas
Marcio Franco
Eric C M Oliveira
Robert Martim
Ramon Durães
Alessandro de Oliveira Faria
Alfred Reinold Baudisch
Os 10+ | Artigos do dia
HTML Básico
HTML Avançado
Criando aplicativos para o Orkut
PL/SQL - Procedures e Funções
Tutorial de Tabelas Dinâmicas no Excel – Parte 1
Como configurar Conexão Remota no SQL Server 2005
WCF – Gerenciamento de Instância
Básico de C++: Estrutura de um programa em C++
ASP.NET 2.0 - Explorando o GridView
Tutorial: Desenhando com o Corel Draw