表更新基于匹配/不匹配

时间:2015-06-09 20:49:02

标签: sql oracle join sql-update

我有两张表t1t2

t1具有以下结构:

yearmonth
account
company
RCV_amount_t1

t2具有以下结构:

yearmonth
account 
company
billing amount
billing amount CM_1
billing amount CM_2
RCV_amount_t2

我想使用t2t1yearmonth加入accountcompany。如果匹配,我希望使用RCV_amount_t2中的值更新RCG_amount_t1。否则,我想将RCV_amount_t2设置为空格。

以同样的方式,我想使用t1t2yearmonthaccount加入company并相应地设置值。

有可能实现吗?如果是这样,我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

  

我想使用yearmonth,account和company加入t2到t1。如果他们   匹配,我想用RCG_amount_t1中的值更新RCV_amount_t2。   否则,我想将RCV_amount_t2设置为空格。

这将使用适当的值更新匹配的行,并更新与NULL不匹配的行。如果字段是数字,则无法将其更新为"空格&#34 ;; NULL将是没有价值的适当指标。如果该字段不是数字,那么您可以进行第二次更新,以便用您喜欢的任何内容替换NULL值,但NULL在我看来仍然是最合适的无价值指标。

UPDATE t2 SET rcv_amount_t2 = (
  SELECT rcv_amount_t1
    FROM t1
    WHERE t1.yearmonth = t2.yearmonth
    AND t1.account = t2.account
    AND t1.company = t2.company
  )

答案 1 :(得分:0)

您想要使用MERGE 它允许您连接两个表并指定如果它们匹配时如何更新值。

MERGE语句的一般结构如下:

MERGE INTO driver_table
USING other_table
ON
(
    driver_table.column1 = other_table.column1
AND driver_table.column2 = other_table.column2
AND ...
)
WHEN MATCHED THEN UPDATE
    SET
        driver_table.some_column = other_table.some_value,
        driver_table.some_flag = 'Y',
        ...
;

答案 2 :(得分:0)

我们似乎无法在一个查询中解决它,我们需要一个merge和一个correlated query,它适用于我:

这将在匹配时用t1的值更新t2:

MERGE INTO t2
   USING (SELECT yearmonth, account, company, RCV_amount_t1 FROM t1) S
   ON (t1.yearmonth = t2.yearmonth and
       t1.account = t2.account and
       t1.company = t2.company)
   WHEN MATCHED THEN UPDATE SET t2.RCV_amount_t2 = S.RCV_amount_t1;

然后在不匹配的情况下将包含corrolated子查询的查询留空:

update t2 set RCV_amount_t2 = '    ' where yearmonth||account||company not in(
select yearmonth||account||company from t1 
where t1.yearmonth = t2.yearmonth and t1.account=t2.account and t1.company=t2.company);