【问题标题】:SQL DB2 stored procedure to add permutations of column based on other columnSQL DB2 存储过程基于其他列添加列的排列
【发布时间】:2012-09-04 13:19:55
【问题描述】:

给定以下表格:

tableA:        | tableB:
               |
col1  col2     | col3  col4
-----------    | ----------
1     4        | 1     x
2     5        | 2     x
3     6        | 1     z
               | 2     z
               | 3     z

我想在 DB2 中编写一个存储过程,通过修改 col3 的值以及它们从 tableA (1-4, 2-5, 3-6) 的映射,在 tableB 中添加一些行,所以添加了这些行:

通过查看col4 = x 所在的行,这些行必须添加到tableB 中:

               | 4     A1 -> (only 1 changed to its mapping value 4)
               | 2     A1

               | 1     B1   
               | 5     B1 -> (only 2 changed to its mapping value 5)

               | 4     C1 -> (1 changed to its mapping value 4)
               | 5     C1 -> (and 2 changed to its mapping value 5)

通过查看 col4 = z 所在的行,这些行必须添加到 tableB 中:

               | 4     A2 -> (only 1 changed to its mapping value 4)
               | 2     A2
               | 3     A2

               | 1     B2 
               | 5     B2 -> (only 2 changed to its mapping value 5)
               | 3     B2

               | 1     C2 
               | 2     C2
               | 6     C2 -> (only 3 changed to its mapping value 6)

               | 4     D2 -> (1 changed to its mapping value 4)
               | 5     D2 -> (and 2 changed to its mapping value 5)
               | 3     D2

               | 4     E2 -> (1 changed to its mapping value 4)
               | 2     E2
               | 6     E2 -> (and 3 changed to its mapping value 6)

               | 1     F2 
               | 5     F2 -> (2 changed to its mapping value 5)
               | 6     F2 -> (and 3 changed to its mapping value 6)

               | 4     G2 -> (1 changed to its mapping value 4)
               | 5     G2 -> (and 2 changed to its mapping value 5)
               | 6     G2 -> (and 3 changed to its mapping value 6)

请注意,在我的示例中,我有:

  • 2 对 1 映射(由 2 行表示:[1,x] 和 [2,x])因此在 tableB 中添加了 3 行。
  • 和 3 对 1 映射(由 3 行表示:[1,z]、[2,z] 和 [3,z])因此在 tableB 中添加了另外 7 行。

如果我在表 B 中有 4 对 1 映射(由 4 行表示),则必须再添加 15 行。
如果我在 tableB 中有 5 对 1 映射(由 5 行表示),则必须再添加 31 行 等等……

(不要将这些映射与tableA的映射混淆。是不同的)

【问题讨论】:

  • 您所描述的过程仍然有点难以理解。你能展示你想要的实际输出的样子吗?特别是因为您说“添加列”,但听起来您想添加 rows...
  • 是的,这是我的错误......我的意思是行。所以只有 tableB 通过添加适当的行来改变(我在我的例子中描述的还有 27 行 - [4,A1], [2,A1], [1,B1], ... , [5,G2] , [6,G2])。
  • 好的,我想我明白了你想要的 - 你正在尝试生成映射的所有可能组合。但是你通过使用“A1”、“B2”等东西让事情变得混乱(因为没有办法生成它,除非有一张你没有告诉我们的表)。我假设您只是使用这些来定义“组”,并且这些值实际上应该是它们的“映射”值,或者它们最初的值(如果是这样,请更改您的“结果”数据以匹配) .我不得不问...为什么?
  • 另外,会有很多行相同的行(假设我已经理解你想要完成的事情),你将没有任何办法告诉他们...请给我们您想要的表格的确切输出,而不是您当前的流程说明。您可以使用 SP 来执行此操作,但如果您可能有无限的级别,则不能 - 您需要递归的东西,但是因为 SQL 在 sets 上工作,您将无法让它“停止” ' 在“第一”行(ROW_NUMBER() 似乎是不允许的 - 如果没有 ORDER BY 无论如何都是毫无价值的......)。
  • 实际上,在我的架构中,这些表中有更多列,但只有我提出的这些列是此过程所需的……我有办法保持 col4 更新,但暂时忽略它。我只是想让您知道 tableB 的现有信息(通过查看您提到的“组”)如何用于生成新行。是的,这是真的,我需要一些递归的东西,但我认为有一种方法可以通过查看 col4 中值的出现次数来知道在哪里停止。例如 x 存在 2 次,因此将添加 2^2-1=3 行,z 存在 3 次,因此将添加 2^3-1=7 行,因此其 2^k-1 新行。

标签: sql database stored-procedures db2 permutation


【解决方案1】:

我很难理解。

我认为最好删除每个子集,然后插入当前映射。 (而不是试图找出增量)

这似乎是不这样非规范化的一个很好的理由。

【讨论】:

  • 我已经编辑了问题以使其清楚...感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多