簡體   English   中英

使用SQL Server 2012遞歸

[英]Recursion with SQL Server 2012

假設下表:

SQL小提琴

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

結果

|                              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在全球范圍內是唯一的
  • 任何方法/建議都很好

尚未完成。嘗試這樣的事情。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM