【发布时间】:2020-04-08 17:11:37
【问题描述】:
我有关系
+-----+----+
| seq | id |
+-----+----+
| 1 | A1 |
| 2 | B1 |
| 3 | C1 |
| 4 | D1 |
+-----+----+
并希望在 PostgreSQL 中加入
+----+-------+
| id | alter |
+----+-------+
| B1 | B2 |
| D1 | D2 |
+----+-------+
所以我得到了所有可能的替换组合(即更多或更少替换的笛卡尔积)。所以第 1 组没有更新,第 2 组只有 B2,第 3 组只有 D2,第 4 组同时有 B2 和 D2。
结尾应该是这样的,但应该对更多人开放(比如 D1 的额外 D3)
+-------+-----+----+
| group | seq | id |
+-------+-----+----+
| 1 | 1 | A1 |
| 1 | 2 | B1 |
| 1 | 3 | C1 |
| 1 | 4 | D1 |
| 2 | 1 | A1 |
| 2 | 2 | B2 |
| 2 | 3 | C1 |
| 2 | 4 | D1 |
| 3 | 1 | A1 |
| 3 | 2 | B1 |
| 3 | 3 | C1 |
| 3 | 4 | D2 |
| 4 | 1 | A1 |
| 4 | 2 | B2 |
| 4 | 3 | C1 |
| 4 | 4 | D2 |
+-------+-----+----+
编辑:
另一个可能的替换表可能是
+----+-------+
| id | alter |
+----+-------+
| B1 | B2 |
| D1 | D2 |
| D1 | D3 |
+----+-------+
应该可以分成6组(希望没有忘记一个案例)
+-------+-----+----+
| group | seq | id |
+-------+-----+----+
| 1 | 1 | A1 |
| 1 | 2 | B1 |
| 1 | 3 | C1 |
| 1 | 4 | D1 |
| 2 | 1 | A1 |
| 2 | 2 | B2 |
| 2 | 3 | C1 |
| 2 | 4 | D1 |
| 3 | 1 | A1 |
| 3 | 2 | B2 |
| 3 | 3 | C1 |
| 3 | 4 | D2 |
| 4 | 1 | A1 |
| 4 | 2 | B2 |
| 4 | 3 | C1 |
| 4 | 4 | D3 |
| 5 | 1 | A1 |
| 5 | 2 | B1 |
| 5 | 3 | C1 |
| 5 | 4 | D2 |
| 6 | 1 | A1 |
| 6 | 2 | B1 |
| 6 | 3 | C1 |
| 6 | 4 | D3 |
+-------+-----+----+
如果你有三个替代品,比如
+----+-------+
| id | alter |
+----+-------+
| B1 | B2 |
| C1 | C2 |
| D1 | D3 |
+----+-------+
它将产生 8 个组。 到目前为止我尝试过的并没有什么帮助:
WITH a as (SELECT * FROM (values (1,'A1'),(2,'B1'), (3,'C1'), (4,'D1') ) as a1(seq, id) )
, b as (SELECT * FROM (values ('B1','B2'), ('D1','D2')) as b1(id,alter) )
---------
SELECT row_number() OVER (PARTITION BY a.id) as g, * FROM
a
CROSS JOIN b as b1
CROSS JOIN b as b2
LEFT JOIN b as b3 ON a.id=b3.id
ORDER by g,seq;
我很高兴为标题提供更好的建议。
【问题讨论】:
-
这是针对这两个替换的吗?或者第二张桌子可以有超过 2 个吗?如果是这样,如果多次替换相同的值怎么办?
-
嗨,戈登,当然可以多两个(我的意思是“像 D1 的额外 D3”):例如,D1 也将被额外的 D3 替换。我猜这将导致 46 行和 16 个组。等等……
-
(what I meant with "like an extra D3 for D1"): So for example D1 would also be replaced by extra D3. This would result in 46 rows with 16 groups I guess"也将被替换" 留有解释空间; “46 行 16 组”的数字也没有点燃我的热情。你能再解释一下吗? (请在问题中澄清!) -
您想要
CROSS JOINs 的动态数字...有趣。 +1 -
组合的数量呈指数增长。表
b中的行数不能超过 20 或 30 行。
标签: sql postgresql routes combinatorics variations