我正在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/ –