2014-02-11 128 views
0

假設如下表:遞歸與SQL Server 2012

SQL Fiddle

MS SQL Server 2012的架構設置

CREATE TABLE entries 
    (
    [entryID] [uniqueidentifier] NOT NULL, 
    [bOpen] [bit] NULL, 
    [nextEntryID] [uniqueidentifier] NULL, 
    ); 

INSERT INTO entries 
(entryID, bOpen, nextEntryID) 
VALUES 
('21572F4C-BA63-489B-9205-AD1451CEE411', 0, NULL), 
('FF4ADC83-1270-418B-8E31-FD1AEA2C1ADF', 0, '21572F4C-BA63-489B-9205-AD1451CEE411'), 
('7ED7AF83-6595-4848-AFDF-4F7D54889F80', 1, NULL), 
('C7AA25D3-B70D-45CB-A143-CF380E6FD0D3', 1, '7ED7AF83-6595-4848-AFDF-4F7D54889F80'), 
('ADA3312E-6FF2-4EC6-9FE3-C994D2FCD16F', 1, 'C7AA25D3-B70D-45CB-A143-CF380E6FD0D3'), 
('9BE0F5FA-09F0-423C-8173-98AD73522412', 0, NULL), 
('5019558E-73FC-4A10-B526-49DB2253B9B9', 1, 'B2EF093A-45B4-4780-A5F5-ECEE02A26274'), 
('B2EF093A-45B4-4780-A5F5-ECEE02A26274', 0, NULL) 

查詢1

select * from entries 

Results

|        ENTRYID | BOPEN |       NEXTENTRYID | 
|--------------------------------------|-------|--------------------------------------| 
| 21572F4C-BA63-489B-9205-AD1451CEE411 |  0 |        (null) | 
| FF4ADC83-1270-418B-8E31-FD1AEA2C1ADF |  0 | 21572F4C-BA63-489B-9205-AD1451CEE411 | 
--------------------------------------------------------------------------------------- 
| 7ED7AF83-6595-4848-AFDF-4F7D54889F80 |  1 |        (null) | 
| C7AA25D3-B70D-45CB-A143-CF380E6FD0D3 |  1 | 7ED7AF83-6595-4848-AFDF-4F7D54889F80 | 
| ADA3312E-6FF2-4EC6-9FE3-C994D2FCD16F |  1 | C7AA25D3-B70D-45CB-A143-CF380E6FD0D3 | 
--------------------------------------------------------------------------------------- 
| 9BE0F5FA-09F0-423C-8173-98AD73522412 |  0 |        (null) | 
--------------------------------------------------------------------------------------- 
| 5019558E-73FC-4A10-B526-49DB2253B9B9 |  1 | B2EF093A-45B4-4780-A5F5-ECEE02A26274 | 
| B2EF093A-45B4-4780-A5F5-ECEE02A26274 |  0 |        (null) | 

正如你可能已經注意到了,我有一個字段nextEntryID,其中包含鏈接的entryID
我在結果中分離出了含有多餘元素的對。

最有趣的一對將是最後兩個條目。兩者都相互關聯,但具有不同的bOpen值(分別爲10)。

我想要查看錶格中的所有條目/配對,其中起始條目有bOpen = 1,並鏈接到另一個條目bOpen = 0

理論上,可以有無限的條目相互鏈接,所以我想我們在這種情況下需要某種遞歸?
或者還有其他方法嗎?


附加信息(感謝@ david.pfx):

  • 的結構是這樣的,我寧可不改變結構,雖然有可能增加的變化。
  • 鏈接條目的「深度」不固定爲2或3;我想大多數時候深度都不會超過4度,但這可能是可能的。
  • IDs是全球唯一
  • 任何方法/建議將是巨大的
+0

需要更多的問題定義。這個數據結構是剛性定義的,還是您創建的?你能改變結構嗎?鏈接深度是固定在2還是3,還是可以更深?這些ID是全球唯一的嗎?你是否堅持一個單一的SQL查詢,存儲過程或算法代碼的答案? –

+0

@ david.pfx看到我上面的更新。 – seph

+0

@KumarHarsh意識到什麼?我完全知道用'NEWID()'生成的條目正在得到...一個新的ID。我這樣做是因爲它確實無關緊要。我認爲這個問題很清楚,但似乎造成混淆,所以我會編輯。 – seph

回答

0

不complete.try這樣的事情。

declare @entries TABLE 
    ([entryID] [uniqueidentifier] NOT NULL,[bOpen] [bit] NULL,[nextEntryID] [uniqueidentifier] NULL 
    ); 

INSERT INTO @entries 
(entryID, bOpen, nextEntryID) 
VALUES 
('21572F4C-BA63-489B-9205-AD1451CEE411', 0, NULL), 
('FF4ADC83-1270-418B-8E31-FD1AEA2C1ADF', 0, '21572F4C-BA63-489B-9205-AD1451CEE411'), 
('7ED7AF83-6595-4848-AFDF-4F7D54889F80', 1, NULL), 
('C7AA25D3-B70D-45CB-A143-CF380E6FD0D3', 1, '7ED7AF83-6595-4848-AFDF-4F7D54889F80'), 
('ADA3312E-6FF2-4EC6-9FE3-C994D2FCD16F', 1, 'C7AA25D3-B70D-45CB-A143-CF380E6FD0D3'), 
('9BE0F5FA-09F0-423C-8173-98AD73522412', 0, NULL), 
('5019558E-73FC-4A10-B526-49DB2253B9B9', 1, 'B2EF093A-45B4-4780-A5F5-ECEE02A26274'), 
('B2EF093A-45B4-4780-A5F5-ECEE02A26274', 0, NULL) 
--select * from @entries 
;With CTE as 
(select a.*,1 rn from @entries a 
where a.nextEntryID is not null and a.bopen=1 
union all 
select e.*,rn+1 from @entries E inner join cte C on c.nextEntryID=e.EntryID and e.bOpen=0 
) 

select a.* from cte a