1
我需要使用兩個字段來標識彼此相關的行,在某種程度上它是一個層次結構,但無法讓CTE正常工作。SQL確定相關行(Hierarchal)
這是一個簡化表:
CREATE TABLE [dbo].[LinkedRows](
[ID] [int] NULL,
[COL1] [nvarchar](50) NULL,
[COL2] [nvarchar](50) NULL,
[LINK] [int] NULL
) ON [PRIMARY]
這裏有一些數據:
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (1, 'A','B')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (2, 'C','B')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (3, 'A','D')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (4, 'D','A')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (5, 'B','A')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (6, 'E','C')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (7, 'B','C')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (8, 'C','E')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (9, 'F','G')
INSERT INTO dbo.LinkedRows (ID, COL1, COL2) VALUES (10, 'G','H')
這就是我想要確定:
ID COL1 COL2 linked
1 A B 1
2 C B 1
3 A D 1
4 D A 1
5 B A 1
6 E C 1
7 B C 1
8 C E 1
9 F G 2
10 G H 2
行1和2兩在COL2中有B,因此A,B和C都是相互關聯的並且被賦予相同的鏈接號碼(ID)。 在第3和第4行中,我們有A,D和D,A,因爲在第5行中有B,A的組合,D可以通過A連接到B,所以現在我們可以將A,B,C,D連接在一起。 在第6和第8行中,我們有E,C和C,E,所以我們現在可以將A,B,C,D,E鏈接在一起。 第7行恰好與第2行相反。 在第9行中,我們有F,G,因爲我們無法建立從A,B,C,D,E中的任何一個到另一個鏈接組的鏈接。 在第10行中,我們有G,H,它可以通過G鏈接到鏈接組2,即F,G,H是相關的。
任何幫助或建議非常感謝。
問候 CM
非常感謝你的代碼效果很好,我的真實世界的數據可能包含不少行,所以我遠離使用遊標,你會說在這種情況下游標是不可避免的嗎?非常感謝,再次感謝。 –
我認爲很難避免某種迭代,無論是在T-SQL中使用遊標還是使用一些外部代碼來運行數據。 對於遞歸CTE的工作,您將需要一個定義良好的終止條件(錨定成員),在這種情況下我看不出如何定義它。 –
我的第一個答案是有缺陷的。它沒有處理兩個小組將由後來的記錄加入的情況。例如:如果有一個記錄:(ID,COL1,COL2)VALUES(11,'C','H'),則應將前兩組加入到一個組中。更新了處理這個問題的代碼。 –