根据映射表数据更新TransactionId

问题描述 投票:0回答:1

我有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的逻辑考虑。

  1. 如果表 1 中只有一个 ProductId 条目,则检查表 2 中是否存在 ProductId。
  • 如果表 2 中没有找到条目,则无需执行任何操作。
  • 如果表2中有条目,则更新 表 2 中这些记录对应的 transnactionID。
  1. 如果 ProductId 在表 1 中有多个条目(最多 3 个条目),则检查表 2 中是否存在 ProductId。
  • 如果表 2 中没有找到条目,则无需执行任何操作。
  • 如果在表2中找到条目,那么我们需要合并表1中的TransactionsId并检查它们属于什么组合并更新表2中各自的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

示例:

  1. ProductId 5 在表 1 中有 2 个条目,transactionId 分别为 1 和 2。 因此表 2 中的 ProductId 5 的 TransactionId 值将为 4
  2. ProductId 6 在表 1 中只有 1 个条目,transactionId 为 3。所以 对于表 2 中的 ProductId 6,TransactionId 值为 3。
  3. ProductId 7 在表 1 中有 2 个条目,transactionId 分别为 1 和 2。 因此表 2 中的 ProductId 7 的 TransactionId 值将为 4。
  4. ProductId 8 在表 1 中有 3 个条目,其中 transactionId 分别为 1、2 和 3. 因此表2中productId 8的TransactionId值为5。
  5. ProductId 9 在表 1 中只有 1 个条目,其 transactionId 为 1。所以 对于表 2 中的 ProductId 9,TransactionId 值为 1。

是否有可能编写单个查询来实现此目的?

注:Oracle 19 是数据库。

sql database oracle plsql
1个回答
0
投票

您可以像这样使用 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;

请参阅此处的小提琴

© www.soinside.com 2019 - 2024. All rights reserved.