我有2张桌子:
表1:
ProductTransaction
(PK均为列)
这里,TransactionId 值选项将为 1 或 2 或 3 | 1 和 2 | 1、2 和 3。
只能有 3 种组合。 ProductId 5 已映射 1 和 2 选项。 ProductId 6 已映射到选项 3。ProductId 8 已映射到所有 3 个选项(1,2 和 3)。
ProductId | TransactionId
-------------+--------------
5 | 1
5 | 2
6 | 3
7 | 1
7 | 2
8 | 1
8 | 2
8 | 3
9 | 1
表 2:
ProductRange
(新添加的 TransactionId
列,默认值为 1,因为它不是空列)
在此表中 PK 为(ProductRangeId、ProductId 和 TransactionId )
ProductRangeId| ProductId | TransactionId
-------------+------------ +--------------
31 | 5 | 1
32 | 6 | 1
33 | 7 | 1
34 | 7 | 1
35 | 7 | 1
36 | 8 | 1
37 | 9 | 1
38 | 9 | 1
参考表1,我想更新表2中的TransactionId。
更新TransactionId的逻辑考虑。
仅可能有低于 3 种的组合,并且仅当在表 1 中找到该产品 ID 的多个条目时才会发生合并。
If the productId mapped to 1 and 2, then the transactionId will be 4 If the productId mapped to 1, 2 and 3, then the transactionId will be 5 If the product mapped to 1 or 2 or 3, then the corresponding transactionId will be the value.
这是一次性活动,直到生产为止。
最终结果如下。
ProductRangeId| ProductId | TransactionId
-------------+------------ +--------------
31 | 5 | 4
32 | 6 | 3
33 | 7 | 4
34 | 7 | 4
35 | 7 | 4
36 | 8 | 5
37 | 8 | 5
38 | 9 | 1
示例:
是否有可能编写单个查询来实现此目的?
注:Oracle 19 是数据库。
您可以像这样使用 MERGE INTO:
MERGE INTO PRODUCTRANGE p
USING ( Select Distinct t.PRODUCTID,
Case When Count(t.TRANSACTIONID) Over(Partition By t.PRODUCTID) = 3 Then 5
When Count(t.TRANSACTIONID) Over(Partition By t.PRODUCTID) = 2 Then 4
When Count(t.TRANSACTIONID) Over(Partition By t.PRODUCTID) = 1 Then t.TRANSACTIONID
End "CONSOLIDATED_TRANSACTIONID"
From PRODUCTTRANSACTION t
) x ON(x.PRODUCTID = p.PRODUCTID)
WHEN MATCHED THEN
UPDATE SET p.TRANSACTIONID = x.CONSOLIDATED_TRANSACTIONID;
请参阅此处的小提琴。