簡體   English   中英

如何使用傳遞屬性從 SQL Server 中的關系表中遞歸查找所有路徑?

[英]How to find all paths recursively from relational table in SQL Server using transitive property?

我希望能夠遞歸地找到表中的所有關系。 我有一個關系表,基本上我想應用傳遞屬性(即如果 A~B,B~C => A~C),並且使用新發現的關系,我想遞歸地這樣做直到找不到更多的路徑。 數據都在 SQL-Server 中。 我找到了其他一些帖子,並嘗試模擬遞歸提供的解決方案。 也許我只是不明白如何實現我的需求?

給出一些背景:

SQL上關系表的示例內容

使關系多向的 SQL 視圖

我想得出什么

關系表將 ID 來自的表與其自身相關聯,這就是我創建多向視圖的原因。 它使加入IDSELECT ID2變得更容易。

考慮我的表只是稱為relatedIDs ,我的視圖稱為relatedView ,而我想創建的派生視圖稱為derivedView ,然后從另一篇文章中提取我嘗試了這樣的事情:

WITH RECURSIVE derivedView AS
(
  SELECT ID
  FROM relatedView
  UNION ALL
  SELECT r.ID, 
  FROM derivedView d, relatedView r
  WHERE r.ID2 = d.ID
)
SELECT * FROM derivedView;

但是,我什至無法真正對此進行測試,因為我在derivedView附近有“無效語法。在第一行期待'(',或AS”。

作為創建表和視圖的請求 SQL:

/* RELATIONAL TABLE 
ID  | ID2
---------
213 | 404
404 | 605
*/
CREATE TABLE relatedIDs (
  [ID] [int] NOT NULL,
  [ID2] [int] NOT NULL,
  PRIMARY KEY (ID, ID2)
);
INSERT INTO relatedIDs VALUES (213, 404);
INSERT INTO relatedIDs VALUES (404, 605);


/* MULTIDIRECTIONAL VIEW
ID  | ID2
---------
213 | 404
404 | 213
404 | 605
605 | 404
*/
SELECT relatedIDs.ID, relatedIDs.ID2
FROM relatedIDs
UNION
SELECT relatedIDS.ID2 AS ID, relatedIDs.ID
FROM relatedIDs


/* What I'd Like to Derive: 
ID  | ID2
---------
213 | 404
404 | 213
404 | 605
605 | 404
213 | 605
605 | 213
*/

請嘗試以下概念示例。

SQL

-- DDL and sample data population, start
DECLARE @tbl table (
    idGeo INT IDENTITY PRIMARY KEY,
    GEO   VARCHAR(64),
    PARENTID INT
);
INSERT INTO @tbl (GEO, PARENTID) VALUES 
(   'EMEA',    NULL),
(   'France',  1),
(   'Normandy',   2),
(   'Germany', 1),
(   'Gascony',  2),
(   'Americas',    NULL),
(   'US',  6);
-- DDL and sample data population, end

--SELECT * FROM @tbl;

WITH cte AS 
(
    -- Anchor query
    SELECT idGEO, GEO, ParentID, 1 AS [Level]
        , CAST('/' + GEO AS VARCHAR(1000)) AS XPath
    FROM @tbl
    WHERE ParentID IS NULL
    UNION ALL
    -- Recursive query
    SELECT t.idGEO, t.GEO, t.ParentID, cte.[Level] + 1 AS [Level]
        , CAST(cte.[XPath] + '/' +  t.GEO AS VARCHAR(1000)) AS [XPath]
    FROM @tbl AS t
        INNER JOIN cte ON t.ParentID = cte.idGEO
    WHERE t.ParentID IS NOT NULL 
)
SELECT idGEO, GEO
    , REPLICATE('  ',[Level]-1) + GEO AS GEOHierarchy
    , [level]
    , [XPath]
FROM cte
ORDER BY XPath;

輸出在此處輸入圖像描述

暫無
暫無

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

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