#oracle
#Oracle
Вопрос:
**Before Merge:**
***Source table as SRC***
-------------
| A | B | C |
-------------
| a | b | 10|
| c | d | 20|
| w | x | 30|
| w | y | 40|
| w | z | 50|
-------------
***Target Table as TGT***
--------------
| D | E | F |
--------------
| a | b | null|
| c | e | null|
| w | m | null|
| w | n | null|
| w | o | null|
-------------
***After Merge:***
***Target table as TGT***
-----------
| D | E | F |
------------
| a | b | 10|
| c | e | 20|
| w | m | 50|
-----------
Я упомянул 2 таблицы выше: одну как исходную таблицу, а другую как целевую таблицу
Я хочу объединить две таблицы выше и сохранить результат в target в oracle
1-я логика:
Логика: (найдите совпадающие значения из столбца A и в столбец D и B в столбец E, и найдено только 1 совпадение) Пример: A.a = D.a и B.b = E.b затем обновите значение столбца C до столбца F, т.е. F = 10
2-я логика: если 1-я логика не найдена, то выясните, совпадают ли значения столбца A со столбцом D, а значение столбца B не совпадает со столбцом E, и найдено только 1 совпадение) Пример: A.c = D.c затем обновите значение столбца C до столбца F, т.е. F = 20
3-я логика: если 1-я логика и 2-я логика не найдены, то выясните, совпадают ли значения столбца A со столбцом D, а значение столбца B не совпадает со столбцом E и найдено несколько совпадений), затем обновите значение столбца C с наибольшим числом в столбце F. Пример: A.w = D.w -> у нас есть 3 строки, из которых мы выбираем значение, имеющее высокое значение, т.е. 50, и сохраняем это значение в столбце F, т.е. F = 50 в одной строке, и удаляем две другие строки
После слияния количество строк уменьшается. Как написать программу для этого, используя концепцию слияния в oracle
Ответ №1:
Вы можете использовать связанный подзапрос следующим образом:
Update tgt t
Set t.f = (Select Coalesce(Max(case when s.b = t.e then s.c end), Max(s.c))
From src s
Where s.a = t.d)
Комментарии:
1. Если у вас есть достаточно времени, не могли бы вы кратко объяснить это, поскольку я новичок в концепции слияния и трех логиках?
2. Я взял все строки из таблицы src, которые соответствуют d в target, и создал два выражения. Сначала позаботится о логике 1. Второй позаботится о логике 2 и 3. И оба они объединяются, что в конечном итоге даст вам желаемый результат. Max используется для удовлетворения логики 3.
3. Если этот ответ решил вашу проблему, вам следует принять ответ, чтобы он был помечен как решенный.
4. Если существует 100 записей, выполнив приведенный выше запрос, получим ли мы ожидаемый результат?
5. СЛИЯНИЕ В TGT T С ИСПОЛЬЗОВАНИЕМ SRC S ДЛЯ ((S.A = T.D) И (S.B = T.E)) ПРИ СОВПАДЕНИИ, А ЗАТЕМ ОБНОВЛЕНИЕ НАБОРА T.F = S.C ПРИ НЕСООТВЕТСТВИИ THEN…………..Do Мне нужно добавить вышеуказанное ОБНОВЛЕНИЕзапрос в this after NOT MATCHED THEN part?