Обновление PL / SQL с использованием CASE в условии соединения?

У меня старая база данных 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?

Спасибо!

Почему бы вам не выразить по-английски, что должно выполнить обновление. На основании вашего выбранного запроса я не уверен, что понимаю требования к обновлению.

Roger Cornejo 18.12.2018 03:28

Добавьте образцы данных из ваших таблиц и ожидаемые результаты после выполнения обновления. Пожалуйста, редактировать свой вопрос и добавьте его только в текстовом формате, без изображений.

Kaushik Nayak 18.12.2018 05:01

Учтите, что разные БД различаются в основном DDL, а не DML, и часто SELECT, INSERT, UPDATE и DELETE очень похожи. Попробуйте написать его, как если бы вы это делали в TSQL, и посмотрите, есть ли какие-либо части, которые нужно адаптировать.

Alejandro 18.12.2018 16:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
318
1

Ответы 1

Здесь немного сложно вывести ваши требования, но если предположить, что написанное вами 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.?????

Трудно предложить больше, основываясь на информации, которую вы нам предоставили

Другие вопросы по теме