T-Sql
查詢 BOM 層次結構中的數據
我有一個包含以下架構的數據表:
ID (Int) --ID of the entry Parent_ID (Int) --ID of the parenting entry, or 0 if there is none Level (Int) --Level in the hierarchy of this entry. Starts at 1. User (int) --ID of the user who owns this entry
我見過這種類型的層次結構,稱為 BOM(物料清單)。
我必須承認,我對如何從 SQL 角度處理 BOM 不是很有經驗。從應用程序中的過程程式碼處理它似乎並不難,但 SQL 是這裡的另一隻野獸。
無論如何,我想要實現的是獲取具有 ID X 的某個使用者的所有條目。但是由於層次結構中較早的條目可能屬於另一個使用者,因此僅使用
WHERE user = X
may 進行過濾很可能會破壞層次結構。換句話說,我需要所有條目
WHERE user = X
,還需要層次結構中更高的所有條目。我目前正在閱讀 CTE,因為我有一種暗示這可能是正確的方法,但我會很感激任何正確方向的提示。如果您有一個願意分享的工作程式碼範例,那也將不勝感激。
正如您所提到的,您可以使用 a
CTE
(實際上是 aRecursive CTE
)來執行業內眾所周知的 BOM 爆炸。如果我正確理解您的邏輯,這本質上是
Recursive CTE
您想要使用的查詢。WITH CTE_Recursive AS -- Recursive CTE to explode the BOM ( -- Base Case SELECT ID AS ChildId, Parent_ID AS ParentId, [Level], [User] FROM BOM WHERE [User] = 5678-- Filter on the User to start with here UNION ALL -- This allows us to call the CTE recursively -- Recursive Case SELECT R.Parent_ID AS ChildId, B.Parent_ID AS ParentId, R.[Level] - 1 AS [Level], B.[User] -- Notice how the Parent of the previous call becomes the Child here, as it recursively works its way up the tree (and the new Parent comes from the BOM table, and is the Parent of the previous Parent). FROM CTE_Recursive AS R INNER JOIN BOM AS B ON R.ParentId = B.ID ) -- Final SELECT for the results SELECT ChildId, ParentId, [Level] FROM CTE_Recursive
讓我知道這是如何工作的,因為我目前沒有任何數據可以測試它,並且您基本上想要反向 BOM 爆炸,因為您需要過濾特定的孩子並獲取所有祖先。(我更習慣於寫一個正常的 BOM 爆炸
recursive CTEs
,你從一個特定的祖先開始並得到所有的孩子。)另外請參閱我上面提供的連結以獲取更多範例和使用recursive CTEs
.