只有第一个被更新的原因是因为一旦我们匹配了该行,它就不会再次更新,即使 JOIN 导致返回 3 行。第一行的状态为 CLAIMED,并且已更新,然后将忽略其余两行匹配的行。
正如帕特里克所提到的,我们可以尝试使用 PIVOT 函数将表 A 中的 3 行减少为一行,状态在其自己的列上。
下面的查询假设每个 number_id 和国家只有一个 DATETIME 值:
create or replace table a (
number_id int, country varchar, status varchar, datetime date
);
insert into a values
(121144, 'USA', 'CLAIMED', '2021-10-10'),
(121144, 'USA', 'BOUGHT', '2021-10-11'),
(121144, 'USA', 'RETURNED', '2021-10-12'),
(121144, 'AU', 'CLAIMED', '2021-09-10'),
(121144, 'AU', 'BOUGHT', '2021-09-11');
create or replace table b (
number_id int, country varchar, status varchar,
claimed_date date, bought_date date, returned_date date
);
insert into b values
(121144, 'USA', 'RETURNED', '2999-12-31', '2999-12-31', '2999-12-31'),
(121144, 'AU', 'BOUGHT', '2999-12-31', '2999-12-31', '2999-12-31');
MERGE INTO B
USING (
SELECT * FROM A
PIVOT(MIN(DATETIME) FOR STATUS IN ('CLAIMED', 'BOUGHT', 'RETURNED'))
AS P (NUMBER_ID, COUNTRY, CLAIMED, BOUGHT, RETURNED)
) A ON (A.NUMBER_ID = B.NUMBER_ID and A.COUNTRY = B.COUNTRY)
WHEN MATCHED THEN
UPDATE SET
B.CLAIMED_DATE = IFF(A.CLAIMED IS NOT NULL, A.CLAIMED, '2999-12-31 23:59:5'),
B.BOUGHT_DATE = IFF(A.BOUGHT IS NOT NULL, A.BOUGHT, '2999-12-31 23:59:5'),
B.RETURNED_DATE = IFF(A.RETURNED IS NOT NULL, A.RETURNED, '2999-12-31 23:59:5');
合并前:
+-----------+---------+----------+--------------+-------------+---------------+
| NUMBER_ID | COUNTRY | STATUS | CLAIMED_DATE | BOUGHT_DATE | RETURNED_DATE |
|-----------+---------+----------+--------------+-------------+---------------|
| 121144 | USA | RETURNED | 2999-12-31 | 2999-12-31 | 2999-12-31 |
| 121144 | AU | BOUGHT | 2999-12-31 | 2999-12-31 | 2999-12-31 |
+-----------+---------+----------+--------------+-------------+---------------+
合并后:
+-----------+---------+----------+--------------+-------------+---------------+
| NUMBER_ID | COUNTRY | STATUS | CLAIMED_DATE | BOUGHT_DATE | RETURNED_DATE |
|-----------+---------+----------+--------------+-------------+---------------|
| 121144 | USA | RETURNED | 2021-10-10 | 2021-10-11 | 2021-10-12 |
| 121144 | AU | BOUGHT | 2021-09-10 | 2021-09-11 | 2999-12-31 |
+-----------+---------+----------+--------------+-------------+---------------+
如果状态是固定的,即只有 CLAIMED、BOUGHT 和 RETURNED 的值,也许您可以重新设计您的表以将它们放入列中?