У меня есть следующий набор данных (Oracle 12):
Table X
+---------+--------+---------------+--------+
| COLN | COLM | COLK | COLP |
+---------+--------+---------------+--------+
| 1 | 500 | K1 | 777 |
+---------+--------+---------------+--------+
Table A
+---------+--------+---------------+--------+
| COL1 | COL2 | COL3 | COL4 |
+---------+--------+---------------+--------+
| 1 | K1 | 500 | B |
| 1 | K2 | 500 | NULL |
+---------+--------+---------------+--------+
Table B
+---------+--------+---------+
| COLZ | COLX | COLW |
+---------+--------+---------+
| 1 | K1 | 777 |
| 1 | K2 | 678 |
+---------+--------+---------+
Три таблицы имеют следующую общность:
X.COLN
= A.COL1
= B.COLZ
X.COLk
= A.COL2
= B.COLX
X.COLM
= A.COL3
Мне нужно написать запрос, который получает значения для следующих столбцов в одном запросе:
X.COLK
, X.COLP
, B.COLX
, B.COLW
Конечной целью является выполнение следующих условий:
- Если в таблице A более одной записи, где
A.COL1
и A.COL3
совпадают (и в таблице X есть соответствующая запись) - И одна из строк не равна нулю, например,
A.COL4 = B
, а другая - NULL
Я обновляю таблицу X, чтобы заменить X.COLK
, X.COLP
(K1 и 777) в моем операторе MERGE
на значения в таблице B (B.COLX
, B.COLW
- K2 и 678).
Возможно ли это?
MERGE INTO X FX
USING (
SELECT COLX ONGOING_X, COLW ONGOING_W
FROM B
WHERE (COLZ, COLX) IN
(SELECT COL1, COL2
FROM A
WHERE COL3 = ?
AND COL1 = ?
AND COL4 IS NULL)
) NEW_B
ON (FX.COLk = ?
AND FX.COLP = ?)
WHEN MATCHED THEN
UPDATE SET
FX.COLk = NEW_B.ONGOING_X,
FX.FOLP = NEW_B.ONGOING_W;