【发布时间】: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