Если я правильно выполнил ваши требования, вам нужно COUNT
сколько совпадений произойдет, и если будет одно совпадение, тогда примите его (независимо от значения tie_condition
), в противном случае выберитегде tie_condition = 1
.
Установка Oracle :
CREATE TABLE A ( id, dt, foo ) AS
SELECT 1, DATE '2019-09-19', CAST( NULL AS VARCHAR2(5) ) FROM DUAL UNION ALL
SELECT 2, DATE '2019-09-19', CAST( NULL AS VARCHAR2(5) ) FROM DUAL;
CREATE TABLE B ( id, startdate, enddate, tie_condition, foo ) AS
SELECT 1, DATE '2019-09-01', DATE '2019-09-30', 1, 'A' FROM DUAL UNION ALL
SELECT 1, DATE '2019-09-10', DATE '2019-09-20', 0, 'B' FROM DUAL UNION ALL
SELECT 1, DATE '2019-09-19', DATE '2019-09-29', 0, 'C' FROM DUAL UNION ALL
SELECT 2, DATE '2019-09-18', DATE '2019-09-20', 0, 'D' FROM DUAL;
Слияние :
merge into A
using ( SELECT A.ROWID As rid,
COUNT(*) OVER ( PARTITION BY A.ROWID ) AS num_matches,
b.tie_condition,
b.foo
FROM A
INNER JOIN B
ON (A.id = B.id and A.dt between B.startdate and B.enddate )
) B
on (A.ROWID = B.rid AND ( B.num_matches = 1 OR B.tie_condition = 1 ) )
when matched then
update set A.foo = B.foo
Результат :
SELECT * FROM A
Выходы:
ID | DT | FOO
-: | :-------- | :--
1 | 19-SEP-19 | A
2 | 19-SEP-19 | D
дБ <> скрипка здесь