创建版本化数据并查找SQL Server中的版本之间的差异

时间:2012-07-02 14:22:41

标签: sql database algorithm tsql

我正在寻找一个好的数据库设计解决方案,以便轻松比较我的版本化数据信息。请查看下面的我的场景(例如,我不能将实际场景放在我们的应用程序中 - 非常抱歉。)

样本数据:

Assembly
-----------
AssemblyId       AssemblyId
--------------------------
1        Assembly1
2        Assembly2


BOM
--------------------------
BOMId   AssemblyId       VersionName        ParentBOMId
-----------------------------------------------------
1           1           V001               NULL
2           1           V002               1
3           1           V003               2
4           1           V004               3
5           1           V005               2

[每次更改BOM记录时,都会从以前的任何版本继承(ParentBOMID) - 如果它是程序集的第一个版本,则ParentBOMID为Null]

BOMDetail
-----------
ID     BOMID       PartName       Qty  
---------------------------------------------------
1     1          Part1             2
2     1          Part2             1
3     1          Part3             2

4     2          Part1             2
5     2          Part2             1
6     2          Part4             2  {Change in PartName here in V002 Base Version V001}

7     3          Part1             2
8     3          Part2             1
9     3          Part4             2
10    3          Part5             9 {Added this part into V003 Base Version V002}

11    4          Part1             2
12    4          Part2             1
13    4          Part4             2
14    4          Part6             9 {this part changed into V004 Base Version V003}

15     5          Part1            2
16     5          Part2            1
17     5          Part9            2  {Change in PartName here in V002 Base Version V002}

我需要将不同的BOM版本相互比较。如果需要将V001与V002或V004与V003进行比较,则很容易,因为可以轻松获得ParentBOMId关系。但是对于V005,它是从V002创建的,如果有人想要将V004与V001进行比较,那就不难了。

P.S。我不能创建一个主要的零件表,我必须使用它来比较部分名称。

当版本控制频率非常高并且父级>>时,任何人都可以建议我使用不同的数据库设计或简单解决方案吗?父>>父级关系可能在层次结构中非常深入。

例如我比较V001和V002输出应该是

V001 Part1 2 V002 Part1 2

V001 Part2 1 V002 Part2 1

V001 Part3 2 V002 NULL 0

V001 NULL 0 V002 Part4 2

我应该能够比较任何版本,并找到上述差异。

1 个答案:

答案 0 :(得分:0)

我会使用两种基本方法...

SELECT
  *
FROM
  (SELECT * FROM BomDetail WHERE BomID = 1)     AS bom1
FULL OUTER JOIN
  (SELECT * FROM BomDetail WHERE BomID = 2)     AS bom2
    ON bom1.PartName = bom2.PartName

SELECT
  PartName,
  SUM(CASE WHEN BomID = 1 THEN qty ELSE 0 END)   AS bom1qty,
  SUM(CASE WHEN BomID = 2 THEN qty ELSE 0 END)   AS bom2qty
FROM
  BomDetail
WHERE
  BomID IN (1,2)
GROUP BY
  PartName

虽然第二个更长,但它也不需要进行连接,因此在某些情况下可以更快。