2016-02-04 7 views
0

Я создаю программу, которая управляет производством, и мне нужно показать прослеживаемость каждого продукта (все пути, которые он потребовал от создания до его окончательной доставки. Позвольте мне показать вам пример :.. завод создает документ A001, с количеством 400 Затем они должны разделить продукт, создавая документы B002 и B003, как с количеством 200 и как с их Parent значением поля A001 После этого, они будут раскол B002 на мелкие куски. Это создает документы C004, C005, C006 и C007, все с количеством 50 и все со значением поля ParentB002 .Эти мелких кусков также может быть разделен снова ...SQL Server Полная прослеживаемость продукта

Теперь, если бы я хотел, чтобы проследить полный цикл документа B002, я бы проверить поле Parent и перекрестите его с полем документа, чтобы получить эту информацию, а затем получите документы, в которых поле Parent равно B002. Это «легкая» часть.

Теперь сложная часть.

Я хочу знать полный цикл документа C007. Я должен проверить его родителя и получить документ B002, ТОГДА должен получить Parent этого документа и получить документ A001. Я также проверял документы с ParentC007 и не нашел их.

Или узнать полный цикл документа A001. Я бы проверял, есть ли какие-либо Parent (их не будет), они должны будут получить все документы с ParentA001, а затем получить все документы с ParentB002 и B003 и так далее.

Есть ли какая-либо функция на SQL, которая позволяет мне это делать, или мне нужно создать процедуру, которая повторяется снова и снова, чтобы проверить как родителей, так и детей? И если это так, я не знаю, что делать, поэтому любая помощь будет оценена.

ответ

1

В принципе, вы просите что-то простое, что было сделано тысячи раз - найдите корень дерева.

Существуют различные подходы к этому, помимо прочего, специальный тип данных (HierarchyId), который поддерживает это право в SQL Server.

https://msdn.microsoft.com/en-us/library/bb677290.aspx

документация для этого.

Это, скорее всего, будет использовать нормальное поле в качестве идентификатора, а лучший подход - это хранимая процедура.

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

есть некоторые мысли об этом - равно как Google тонн этого (существуют различные подходы к запрашивают их).

http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

от довольно авторитетного источника и с помощью КТР Как это:

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 
+0

Спасибо. Это кажется хорошим началом. – ThadiusZho