SQL 服务器 产品的完整可追溯性
SQL Server Full traceability of a product
我正在创建一个管理制造工厂的程序,我需要显示每个产品的可追溯性(它从创建到最终交付所采用的所有路径。
让我给你看一个例子:
工厂创建文档 A001
,数量 400
。
然后,他们需要拆分产品,创建文档 B002
和 B003
,两者的数量都是 200
,并且它们的 Parent
字段值都是 A001
。
之后,他们会将 B002
分成更小的部分。这会创建文档 C004
、C005
、C006
和 C007
,所有文档的数量都为 50
,所有文档的 Parent
字段值都为 B002
.这些小块也可以再拆分...
现在,如果我想跟踪文档 B002
的完整周期,我会检查 Parent
字段并将其与文档字段交叉以获取该信息,然后获取Parent
字段为 B002
的文档。那是 "easy" 部分。
现在是棘手的部分。
我想知道文档C007
的完整周期。我必须检查他的 parent 并获取 B002
文档,然后必须获取该文档的 Parent
并获取 A001
文档。我还会使用 Parent
C007
检查文档并找到 none。
或者知道文档的完整周期A001
。我会检查是否有任何 Parent
(不会有),他们我必须用 Parent
A001
获取所有文档,然后用 [= 获取所有文档16=] B002
和 B003
等等。
SQL 上是否有任何函数可以让我执行此操作,或者我是否必须创建一个反复出现的过程来检查 parent 和孩子?如果是这样,我不知道该怎么做,所以任何帮助将不胜感激。
基本上你要求的是一个已经被做过数千次的简单事情——找到一棵树的根。
有多种方法可以解决这个问题,其中一种特殊数据类型 (HierarchyId) 在 SQL 服务器中支持该权限。
https://msdn.microsoft.com/en-us/library/bb677290.aspx
是这方面的文档。
也就是说,您可能会使用普通字段作为 ID - 然后最好的方法是存储过程。
http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm
对此有一些想法 - google 很多(有多种查询方法)。
来自信誉良好的来源并使用像这样的 CTE:
WITH MyCTE
AS ( SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL )
SELECT *
FROM MyCTE
我正在创建一个管理制造工厂的程序,我需要显示每个产品的可追溯性(它从创建到最终交付所采用的所有路径。
让我给你看一个例子:
工厂创建文档 A001
,数量 400
。
然后,他们需要拆分产品,创建文档 B002
和 B003
,两者的数量都是 200
,并且它们的 Parent
字段值都是 A001
。
之后,他们会将 B002
分成更小的部分。这会创建文档 C004
、C005
、C006
和 C007
,所有文档的数量都为 50
,所有文档的 Parent
字段值都为 B002
.这些小块也可以再拆分...
现在,如果我想跟踪文档 B002
的完整周期,我会检查 Parent
字段并将其与文档字段交叉以获取该信息,然后获取Parent
字段为 B002
的文档。那是 "easy" 部分。
现在是棘手的部分。
我想知道文档C007
的完整周期。我必须检查他的 parent 并获取 B002
文档,然后必须获取该文档的 Parent
并获取 A001
文档。我还会使用 Parent
C007
检查文档并找到 none。
或者知道文档的完整周期A001
。我会检查是否有任何 Parent
(不会有),他们我必须用 Parent
A001
获取所有文档,然后用 [= 获取所有文档16=] B002
和 B003
等等。
SQL 上是否有任何函数可以让我执行此操作,或者我是否必须创建一个反复出现的过程来检查 parent 和孩子?如果是这样,我不知道该怎么做,所以任何帮助将不胜感激。
基本上你要求的是一个已经被做过数千次的简单事情——找到一棵树的根。
有多种方法可以解决这个问题,其中一种特殊数据类型 (HierarchyId) 在 SQL 服务器中支持该权限。
https://msdn.microsoft.com/en-us/library/bb677290.aspx
是这方面的文档。
也就是说,您可能会使用普通字段作为 ID - 然后最好的方法是存储过程。
http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm
对此有一些想法 - google 很多(有多种查询方法)。
来自信誉良好的来源并使用像这样的 CTE:
WITH MyCTE
AS ( SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL )
SELECT *
FROM MyCTE