我有两张表t1
和t2
。
t1
具有以下结构:
yearmonth
account
company
RCV_amount_t1
t2
具有以下结构:
yearmonth
account
company
billing amount
billing amount CM_1
billing amount CM_2
RCV_amount_t2
我想使用t2
,t1
和yearmonth
加入account
到company
。如果匹配,我希望使用RCV_amount_t2
中的值更新RCG_amount_t1
。否则,我想将RCV_amount_t2
设置为空格。
以同样的方式,我想使用t1
,t2
和yearmonth
与account
加入company
并相应地设置值。
有可能实现吗?如果是这样,我该怎么做呢?
答案 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);