如何使用存储过程创建Master Child递归结构

时间:2017-02-07 21:31:14

标签: c# sql sql-server

我有三个相关的五个表父子和另一个表,它存储有关子表中项目的信息。

以下是我的表格:

父表

  Parent Item ID   PARENT Description       width     Parent item Thickness
    500200          500200 Description        15              20
    500201          500201 Description1       5               2
    500202          500202 Description2       1.5            16
    500203          500203 Description3       15             20

子表

Parent Item ID    Item ID    Quantity     
   500200       100200      1
   500200       400200      1
   500200       300200      1
   300200       100200      1

子项详细信息表如下所示

表存储Item = 100200在表X中,Item = 400200在表Y中,Item = 300200

表X

Item ID  DECRIPTION  THICKNESS  DIAMETER    WIDTH  
100200   100200DESC    0.15     1.5           5

表Y

Item ID  DECRIPTION     NAME       SIZE    
400200   400200DESC     XYZ       4X6      

表z

Item ID  DECRIPTION     NAME       SIZE    offset
300200   300200DESC     XYZ       3X9      0.375

我们要做的是使用C#创建一个物料清单结构或父到子递归结构。

我想创建一个SQL Server视图或存储过程,如下所示。

我希望看到类似这样的内容:父表中的所有列,子表以及基于父子关系的表X,Y,Z中的一些列。

      parent ID  PARENT Description  Parent Thickness   Item ID    Quantity     child DECRIPTION     THICKNESS    offset     SIZE
        500200     500200 Description     20             100200      1         100200DESC                 0.15
        500200     500200 Description     20             400200      1         400200DESC                                      4X6
        500200     500200 Description     20             300200      1         300200DESC                             0.375
        300200     300200 Description     20             100200      1         100200DESC                0.15                  3X9

1 个答案:

答案 0 :(得分:1)

如果您要为每个项目查找多个行,则每行具有不同的值。你可以尝试:

SELECT 
  childTable.ParentItemID,
  parentTable.ParentDescription,
  childTable.ItemID,
  childTable.Quantity,
  fields.Description,
  fields.Name,
  fields.Value
FROM childTable
LEFT JOIN parentTable ON childTable.ParentItemID = parentTable.ParentItemID
LEFT JOIN (
      SELECT ItemID, Description, "THICKNESS" AS Name, THICKNESS AS Value FROM TableX
      UNION ALL
      SELECT ItemID, Description, "SIZE", SIZE FROM TableY
      UNION ALL
      SELECT ItemID, Description, "offset", offset FROM TableZ
      UNION ALL
      SELECT ItemID, Description, "DIAMETER", DIAMETER FROM TableX
      UNION ALL
      SELECT ItemID, Description, "WIDTH", WIDTH FROM TableX
) AS fields ON fields.ItemID = childTable.ItemID
ORDER BY childTable.ParentItemID, childTable.ItemID, fields.Name

通过调整联合选择,可以使用更多列和更少行来更改此值。

当然,当我处理与基本表绑定的“动态”额外值时,我通常只创建一个详细信息表,如下所示:

DetailTable:
  ItemID
  DetailTypeID
  DetailValue

当然,如果你确实想要将一堆细节作为一行中的列,那么这种方式可能需要一些努力。