【问题标题】:Update a field on Table 1 based on criteria on Table 2? ORACLE根据表 2 中的标准更新表 1 中的字段?甲骨文
【发布时间】: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


【解决方案1】:
UPDATE tower_payment
   SET payment_status   = CASE
                              WHEN (SELECT payment_done
                                      FROM payment_status
                                     WHERE tower_payment.apartment_num = payment_status.apartment_num) < month_payment
                              THEN
                                  3
                              WHEN (SELECT payment_done
                                      FROM payment_status
                                     WHERE tower_payment.apartment_num = payment_status.apartment_num)
                                       IS NULL
                              THEN
                                  2
                              ELSE
                                  1
                          END;

【讨论】:

  • 工作得很好!但我必须在 WHERE 子句中添加“AND ROWNUM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2017-01-24
  • 2020-05-18
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多