2

我在一个递归表中有这些数据,我想展平这个层次结构信息。我通过查询完成了这一点,但我想知道是否有更好的方法来获得相同的结果。

我拥有的数据:

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
4

1 回答 1

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

演示

于 2012-12-27T21:07:07.670 回答