У меня старая база данных Oracle 10g, и мне нужно написать обновление. Я пишу намного лучше TSQL, но мой PL / SQL - отстой, поэтому мне нужна помощь.
У меня есть 3 таблицы: таблица источников, ссылок и назначения. Поскольку данные в таблицах плохие, мне нужно использовать функции REPLACE / TRIM и CASE, чтобы я мог работать с объединениями.
Однако это вызывает проблемы, и я не могу понять, как я могу написать обновление после использования CASE. Я попытался использовать MERGE и UPDATE, но безуспешно. Я написал этот оператор SELECT, и все должно работать нормально:
SELECT
C.NAME,
-- C.FLAG -- How I can update flag here?
FROM TEST.C_TABLE C
INNER JOIN
(
SELECT
CASE
WHEN LENGTH(TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', ''))) = 15
THEN TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', '')) -- TRUE, because some rows causes problems...
ELSE TRIM(REPLACE(REPLACE(REPLACE(SUBSTR(ID ,-9, 9), '-', ''), '&&', ''), '"', '')) -- FALSE
END ID,
NAME
FROM TEST.B_TABLE
) B
ON B.NAME = C.NAME
INNER JOIN A_TABLE A ON REPLACE(A.ID, '&&', '') = B.ID
Как я могу «преобразовать» этот оператор SELECT в UPDATE или MERGE?
Спасибо!
Добавьте образцы данных из ваших таблиц и ожидаемые результаты после выполнения обновления. Пожалуйста, редактировать свой вопрос и добавьте его только в текстовом формате, без изображений.
Учтите, что разные БД различаются в основном DDL, а не DML, и часто SELECT
, INSERT
, UPDATE
и DELETE
очень похожи. Попробуйте написать его, как если бы вы это делали в TSQL, и посмотрите, есть ли какие-либо части, которые нужно адаптировать.
Здесь немного сложно вывести ваши требования, но если предположить, что написанное вами SELECT возвращает источник строк из C_TABLE, тогда, пока вы также извлекаете первичный ключ, он становится чем-то, что вы используете в качестве источника для стандартного MERGE.
Таким образом, вы получите что-то вроде
merge into TEST.C_TABLE c
using
(
SELECT
c.primary_key_column,
C.NAME,
FROM TEST.C_TABLE C
INNER JOIN
(
SELECT
CASE
WHEN LENGTH(TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', ''))) = 15
THEN TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', '')) -- TRUE, because some rows causes problems...
ELSE TRIM(REPLACE(REPLACE(REPLACE(SUBSTR(ID ,-9, 9), '-', ''), '&&', ''), '"', '')) -- FALSE
END ID,
NAME
FROM TEST.B_TABLE
) B
ON B.NAME = C.NAME
INNER JOIN A_TABLE A ON REPLACE(A.ID, '&&', '') = B.ID
) source_data
on c.primary_key_column = source_data.primary_key_column
when matched then
update set c.FLAG = source_data.?????
Трудно предложить больше, основываясь на информации, которую вы нам предоставили
Почему бы вам не выразить по-английски, что должно выполнить обновление. На основании вашего выбранного запроса я не уверен, что понимаю требования к обновлению.