T-Sql

查詢 BOM 層次結構中的數據

  • December 12, 2020

我有一個包含以下架構的數據表:

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 = Xmay 進行過濾很可能會破壞層次結構。

換句話說,我需要所有條目WHERE user = X,還需要層次結構中更高的所有條目。

我目前正在閱讀 CTE,因為我有一種暗示這可能是正確的方法,但我會很感激任何正確方向的提示。如果您有一個願意分享的工作程式碼範例,那也將不勝感激。

正如您所提到的,您可以使用 a CTE(實際上是 a Recursive 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.

引用自:https://dba.stackexchange.com/questions/281414