首页 > 解决方案 > SQLite 如何在一个表中使用自引用设置连接以创建多列

问题描述

我对 SQL 非常陌生。

我有一个如下所示的 SQLite 表:

CREATE TABLE DIM_Geography 
(
    ID int NOT NULL,
    ParentID int NULL,
    [Type] nvarchar(50) NULL,
    Name nvarchar(150) NULL
)

其中的数据如下所示:

    id  ParentID  Type  Name
------+----------+-----+-----+
     1| 200      |town |townN|
   200| 3000     |area |areaN|
  3000| 40000    |prov |provN|
 40000|          |dutc |dutcN|

因此,parentID 的数量越高,排名越高,最高的总是其 parentID 为NULL,id 的数量越少,排名越低

我想得到一个排序的连接视图,如:

   Name1|Type1|Name2|Type2|Name3|Type3|Name4|Type4
   dutcN|dutc |provN|prov |areaN|area |townN|town 

有时第三或第四列或除第一列和最后一列之外的任何列都丢失了,我想复制丢失的列中的最低排名。所以它看起来像:

   Name1|Type1|Name2|Type2|Name3|Type3|Name4|Type4
   dutcN|dutc |townN|town |townN|town |townN|town 

到目前为止,我根本没有想出任何解决方案,因为我真的不擅长 sqlite,除了:

SELECT 
    n1.Name AS 'Name1',
    t1.Type AS 'Type1'
FROM 
    DIM_Geography n1
LEFT JOIN 
    DIM_Geography t1 ON n1.ParentID = t1.ID
ORDER BY Type1

唯一的作用是 dutcN 的顺序层次结构在顶部,因为它没有任何 parentID

标签: sqlsqlitejoin

解决方案


如果我理解正确,你想要一堆left joins coalesce()

select g1.name, g1.type,
       coalesce(g2.name, g1.name), coalesce(g2.type, t1.type),
       coalesce(g3.name, g2.name, g1.name), coalesce(g3.type g2.type, t1.type),
       coalesce(g4.name, g3.name, g2.name, g1.name), coalesce(g4.name, g3.type g2.type, t1.type),
from DIM_Geography g1 left join
     DIM_Geography g2
     on g2.id = g1.parentid left join
     DIM_Geography g3
     on g3.id = g2.parentid left join
     DIM_Geography g4
     on g4.id = g3.parentid 
where g1.type = 'dutc'

推荐阅读