Tsql SQL Server扁平化层次结构表
我把这些数据放在一个递归表中,我想把这个层次结构信息展平。我通过查询完成了这一点,但我想知道是否有更好的方法来获得相同的结果 我拥有的数据:Tsql SQL Server扁平化层次结构表,tsql,sql-server-2008-r2,sql-server-2008r2-express,Tsql,Sql Server 2008 R2,Sql Server 2008r2 Express,我把这些数据放在一个递归表中,我想把这个层次结构信息展平。我通过查询完成了这一点,但我想知道是否有更好的方法来获得相同的结果 我拥有的数据: CREATE TABLE [dbo].[ElementosGeograficos_]( [IdElement] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NOT NULL, [IdParentElement] [int] NULL, [IdLevel] [int]
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
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
我需要的查询结果:
- 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
我的疑问是:
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
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
因为您似乎有两个已知的级别,所以可以使用自连接、合并和case语句
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