我正在SQL Server 2008中工作。我需要从表中提取数据(称为“T”)并通过DML将其载入另一个表(即,INSERT INTO ... SELECT ... FROM ...
语法)。表T是定义了4个级别的分级表(级别4是最低级别,级别1是最高级别)。表T的基本表结构是:SQL分层表:如何跳转级别
CREATE TABLE T
(
PK int
,parentID int
,level int
,attribute1 varchar(255)
,attribute2 varchar(255)
,.
.
.
,attributeN varchar(255)
);
每一行该表中映射到正好1行中通过的parentID(到PK)它上面的水平。我需要在我的SELECT
中有效地“展平”表格T.也就是说,对于给定的第4级行,我需要从该行中选择一些属性,从其对应的第2级父级中选择一些属性,并从其相应第1级父级中选择一些属性。很明显,我可以很容易地用JOIN
在parent.PK = child.parentID
上做到这一点。但是,每个级别4行并不总是存在“级别3”父级。对于这些情况,级别4行直接映射到级别2父级。尽管如此,我仍然需要编写一个可以在所有情况下使用的DML模板(无论是三级父级存在还是不存在)。我怎样才能做到这一点?我的基本查询(我知道是错的)是:
SELECT
level4.attribute1
,level2.attributeN
,level1.attribute2
FROM
T AS level4
INNER JOIN
T AS level3
ON
level3.PK = level4.parentID
INNER JOIN
T AS level2
ON
level2.PK = level3.parentID
INNER JOIN
T AS level1
ON
level1.PK = level2.parentID
WHERE
level4.PK = 100
;
你在这里挣扎的原因是因为你的表缺乏规范化。属性1,属性2等被称为重复组并违反1NF。你应该拥有一个允许像这样嵌套的架构。邻接列表是最常见的处理方法,但嵌套集合更好。或者也有hierarchyid数据类型。无论您需要提供ddl,样本数据还是所需的输出。这里是一个开始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –