Выполнение обновления SQL с подзапросами для имен столбцов

#sql #oracle

#sql #Oracle

Вопрос:

Я знаю, что это действительно запутанный фрагмент SQL, но, по сути, одна из обезьян ввода данных, где я работаю, сильно облажалась, и копия глубоко проникла в нашу систему.

Существует довольно большое количество таблиц, в которых необходимо изменить значение с VAL1 на VAL2, если другое значение равно VAL3. Проблема в том, что я не знаю всех таблиц, в которых это имеет место, и существует строгая политика именования столбцов, которая означает, что все таблицы имеют уникальные имена столбцов.

Я написал следующий SQL, чтобы попытаться выполнить это обновление, но это не работает:

 UPDATE 
 (SELECT DISTINCT TABLE_NAME AS tbTableName 
  FROM ALL_TAB_COLUMNS 
  WHERE COLUMN_NAME LIKE '%MAJR%')
SET 
 (SELECT COLUMN_NAME AS tbColumnName 
  FROM tbTableName 
  WHERE COLUMN_NAME LIKE '%MAJR%') = 'VAL2'
WHERE 
 (SELECT COLUMN_NAME AS tbColumnNameWhere 
  FROM tbTableName 
  WHERE COLUMN_NAME LIKE '%PROGRAM%') = 'VAL3'
 AND tbColumnName = 'VAL1';
  

Но да, это заканчивается ошибкой: недопустимый пользователь.таблица.столбец, таблица.столбец или спецификация столбца
01747. 00000 — «недопустимый пользователь.таблица.столбец, таблица.столбец или спецификация столбца»

Будем признательны за любую помощь.

Комментарии:

1. Вам потребуется использовать динамический sql

Ответ №1:

К сожалению, вы не можете выполнять подобные подзапросы. Лучше всего использовать PHP или любой другой ваш основной язык сценариев и запросить базу данных для создания всех инструкций SQL для вас.

Комментарии:

1. Огромное спасибо за это 🙂 — Я использую SQR, так что это не должно быть слишком плохо