2012-12-27 2 views
2

이 데이터는 재귀 테이블에 있으며이 계층 정보를 병합하고 싶습니다. 쿼리를 수행하여이 작업을 수행했지만 동일한 결과를 얻는 더 좋은 방법이 있는지 궁금해하고있었습니다.SQL Server 병합 계층 테이블

데이터 내가 가진 그 : 내가 필요

CREATE TABLE [dbo].[ElementosGeograficos_](
    [IdElement] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
    [IdParentElement] [int] NULL, 
    [IdLevel] [int] NOT NULL, 

    CONSTRAINT [PK_ElementosGeograficos_] 
     PRIMARY KEY CLUSTERED ([IdElement] ASC) 
GO 

insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Colombia',null,1 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Venezuela',null,1 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Cundinamarca',1,2 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Antioquia',1,2 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Valle',1,2 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Distrito Capital',2,2 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Bogota',3,3 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Medellin',4,3 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Cali',5,3 
insert ElementosGeograficos_ (Name,IdParentElement,IdLevel) select 'Caracaas',6,3 

쿼리 결과 : 내가 가진

- NUM 1   2     3 
- 1 Colombia Null    Null 
- 2 Venezuela Null    Null 
- 3 Colombia Cundinamarca  Null 
- 4 Colombia Antioquia   Null 
- 5 Colombia Valle    Null 
- 6 Venezuela Distrito Capital Null 
- 7 Colombia Cundinamarca  Bogota 
- 8 Colombia Antioquia   Medellin 
- 9 Colombia Valle    Cali 
- 10 Venezuela Distrito Capital Caracaas 

검색어 :

SELECT 
    EG1.IdElementoGeografico, EG1.Nombre 'Pais', 
    EG2.Nombre 'Departamento', EG3.Nombre 'Ciudad' 
FROM 
    ElementosGeograficos_ EG1 
LEFT JOIN 
    ElementosGeograficos_ EG2 ON EG2.IdElementoGeografico = EG1.IdElementoPadre 
LEFT JOIN 
    ElementosGeograficos_ EG3 ON EG3.IdElementoGeografico = EG2.IdElementoPadre 
WHERE 
    EG1.IdNivelGeografico = 1 

UNION 

SELECT 
    EG1.IdElementoGeografico, EG2.Nombre 'Pais', 
    EG1.Nombre 'Departamento', EG3.Nombre 'Ciudad' 
FROM 
    ElementosGeograficos_ EG1 
LEFT JOIN 
    ElementosGeograficos_ EG2 ON EG2.IdElementoGeografico = EG1.IdElementoPadre 
LEFT JOIN 
    ElementosGeograficos_ EG3 ON EG3.IdElementoGeografico = EG2.IdElementoPadre 
WHERE 
    EG1.IdNivelGeografico = 2 

UNION 

SELECT 
    EG1.IdElementoGeografico, EG3.Nombre 'Pais', 
    EG2.Nombre 'Departamento', EG1.Nombre 'Ciudad' 
FROM 
    ElementosGeograficos_ EG1 
LEFT JOIN 
    ElementosGeograficos_ EG2 ON EG2.IdElementoGeografico = EG1.IdElementoPadre 
LEFT JOIN 
    ElementosGeograficos_ EG3 ON EG3.IdElementoGeografico = EG2.IdElementoPadre 
WHERE 
    EG1.IdNivelGeografico = 3 

답변

1

는 두 개의 알려진 수준을 갖고있는 것 같다 때문에 당신 자기 조인, 합체 및 사례 성명 사용 가능

SELECT 
    first.IdElement num, 
    COALESCE(third.name, second.Name, first.Name) [1], 
    CASE WHEN Third.Name IS NOT NULL THEN second.Name 
     WHEN SECOND.Name IS NOT NULL THEN first.Name 
    END as [2], 
    CASE WHEN Third.Name IS NOT NULL and second.Name IS NOT NULL THEN First.Name 
    END [3] 
FROM 
    ElementosGeograficos_ first 
    LEFT JOIN ElementosGeograficos_ second 
    ON first.IDParentElement = second.IdElement 
    LEFT JOIN ElementosGeograficos_ third 
    ON second.IDParentElement = third.IdElement 

DEMO

+0

감사합니다. Conrad Frix – foluis