根據這個問題的標題,我試圖在具有特定屬性(最接近的父記錄)的同一個表中遞回地將記錄連接到另一條記錄,但我不完全確定如何處理這個問題。示例 SQLFiddle:
http://sqlfiddle.com/#!18/0c5fb/2
我試圖實作的最終結果是這樣的,其中每一行都知道它最近的祖先,其中 NeededElement 為真:
| 元素ID | 元素名稱 | 所需元素 | 父元素 ID | 最近需要的元素ID |
|---|---|---|---|---|
| 1 | 根元素 | 真的 | (空值) | (空值) |
| 2 | 子元素 A | 真的 | 1 | 1 |
| 3 | 子元素 B | 錯誤的 | 1 | 1 |
| 4 | 子元素 AA | 錯誤的 | 2 | 2 |
| 5 | 子元素 AB | 錯誤的 | 2 | 2 |
| 6 | 子元素 BA | 錯誤的 | 3 | 1 |
| 7 | 子元素BB | 錯誤的 | 3 | 1 |
提前謝謝了!
uj5u.com熱心網友回復:
您可以使用條件為最近的父級保留一個正在運行的列:
with cte(id, name, n_elem, p, l) as (
select *, null from testelements where parentelementid is null
union all
select t.*, case when c.n_elem = 1 then c.id else c.l end
from cte c join testelements t on t.parentelementid = c.id
)
select * from cte;
uj5u.com熱心網友回復:
您可以嘗試對共享查詢進行以下修改。
WITH CTE AS
(
SELECT
ElementID,
ElementName,
NeededElement,
ParentElementID,
ParentElementID as NextParentElementID,
CAST(NULL AS INT) as ClosestNeededElementID
FROM TestElements
UNION ALL
SELECT
CTE.ElementID,
CTE.ElementName,
CTE.NeededElement,
CTE.ParentElementID,
TestElements.ParentElementID as NextParentElementID,
CASE
WHEN TestElements.NeededElement=1 THEN TestElements.ElementID
END AS ClosestNeededElementID
FROM CTE
INNER JOIN TestElements ON CTE.NextParentElementID = TestElements.ElementID
WHERE CTE.ClosestNeededElementID IS NULL
)
SELECT
ElementID,
ElementName,
NeededElement,
ParentElementID,
ClosestNeededElementID
FROM CTE
WHERE (ParentElementId IS NULL) OR (ClosestNeededElementId IS NOT NULL)
ORDER BY ElementID ASC
查看作業演示小提琴
讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316300.html
標籤:sql sql-server 查询语句 公用表表达式
