【发布时间】:2017-10-12 18:28:33
【问题描述】:
我正在努力制作一个适用于以下数据的更新脚本:
TOWER_PAYMENT TABLE
==============================================================
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|MONTH_PAYMENT|PAYMENT_STATUS
201703 |10 |101 |700 |NULL
201704 |10 |101 |700 |NULL
201703 |10 |102 |700 |NULL
201704 |10 |102 |700 |NULL
201703 |20 |101 |800 |NULL
201704 |20 |101 |800 |NULL
201703 |20 |102 |800 |NULL
201704 |20 |102 |800 |NULL
PAYMENT_STATUS TABLE
==============================================
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|PAYMENT_DONE
201703 |10 |101 |700
201704 |10 |101 |400
201703 |10 |102 |500
201704 |10 |102 |700
201703 |20 |101 |800
我希望使用基于不同条件的数字来更新“PAYMENT_STATUS”字段:
- 如果在“PAYMENT_STATUS”表中找到属于“TOWER_ID”的“APARTMENT_NUM”以匹配“PAY_PERIOD”,则将“PAYMENT_STATUS”字段更新为 1。
- 如果在匹配“PAY_PERIOD”的“PAYMENT_STATUS”表中找不到属于“TOWER_ID”的“APARTMENT_NUM”,则将“PAYMENT_STATUS”字段更新为2。
- 如果“APARTMENT_NUM”的“PAYMENT_DONE”小于“MONTH_PAYMENT”,则将“PAYMENT_STATUS”字段更新为 3。
期望的输出应该是:
TOWER_PAYMENT
====================================================================
PAY_PERIOD|TOWER_ID|APARTMENT_NUM|MONTH_PAYMENT|PAYMENT_STATUS
201703 |10 |101 |700 |1
201704 |10 |101 |700 |3
201703 |10 |102 |700 |3
201704 |10 |102 |700 |1
201703 |20 |101 |800 |1
201704 |20 |101 |800 |2
201703 |20 |102 |800 |2
201704 |20 |102 |800 |2
我已尝试使用 MERGE INTO,但在不匹配时无法更新。
提前致谢!
【问题讨论】:
-
你试过什么?通过使用外连接和 case 语句,这似乎相当容易。
-
这是一个糟糕的数据模型。为什么你在第一张表中显示一个标志,当有人付款时它会立即变得不正确?或者当您自己的一位操作员将纠正他们在第二个表中键入数据时所犯的错误时?为什么你甚至有两个表开始 - “收到的付款”可能在第一个表中!
-
1.- 我尝试使用 MERGE INTO 和 JOIN 方法,但是当 PAYMENT_STATUS 表上找不到公寓时,我找不到更新方法。 2.- 我目前被那个糟糕的数据模型所困扰,遗憾的是我无法改变它:(
标签: oracle sql-update oracle-sqldeveloper