2013-06-04 3 views
0

У меня есть 2 таблицы. Тот, который имеет имена менеджеров и нулевой столбец, который я хочу вставить данные из таблицы 1 (имеющей иерархию). Я вычислил нашу часть вставки, но вместо того, чтобы использовать точное имя, я хочу передать имя из таблицы 2 в таблицу 1, используя переменную, чтобы ее динамика. сообщите мне, если это можно сделать и как это сделать.Как передать имя как переменную из одной таблицы в другую

UPDATE direct_manager_report 
Set Manager_level_number = 
(Select 'Manager_Level_0' from manager_hierarchy where level_0_manager_name = 'ABC' 
UNION 
Select 'Manager_Level_1' from manager_hierarchy where level_0_manager_name < > 'ABC' AND level_1_manager_name = 'ABC' 
UNION 
Select 'Manager_Level_2' from manager_hierarchy where level_1_manager_name < > 'ABC' AND level_2_manager_name = 'ABC' 
UNION 
Select 'Manager_Level_3' from manager_hierarchy where level_2_manager_name < > 'ABC' AND level_3_manager_name = 'ABC' 
) 
Where full_name = 'ABC' 
+0

Откуда вы получите имена? И действительно ли этот код дает вам необходимое вам обновление? –

+0

'' Manager_Level_0'' является постоянной строкой. Вы имели в виду столбец с именем «Manager_Level_0»? Кроме того, я не думаю, что вы можете обновить поле с запросом, который имеет более 1 строки (и это тоже не имеет смысла). Я предполагаю, что вы хотите заменить '' ABC'' на 'direct_manager_report.someColumn' (который, вероятно, будет работать именно так). – Dukeling

+0

Уровень менеджера 0 - это 1-й столбец в иерархии, который доходит до 14. То, что я пытаюсь выполнить, - передать имя менеджера из таблицы 2 (direct_manageR_report) в таблицу 1 (manager_hierarchy) через переменную и найти самый высокий уровень, который занимает менеджер в иерархии. в вышеупомянутом заявлении sql ABC находится на уровне 3, который будет отображаться и заполняться в таблице direct_manager_report. –

ответ

0

Я считаю, что это должно работать, если вы просто хотите иметь одно место, чтобы поместить имя менеджера, предполагая, что запрос возвращает желаемые результаты в сторону от необходимости жесткого кода «ABC» везде:

DECLARE @man_name AS VARCHAR(50) = 'ABC' 
UPDATE direct_manager_report 
Set Manager_level_number = 
(Select 'Manager_Level_0' from manager_hierarchy where level_0_manager_name = @man_name 
UNION 
Select 'Manager_Level_1' from manager_hierarchy where level_0_manager_name < > @man_name AND level_1_manager_name = @man_name 
UNION 
Select 'Manager_Level_2' from manager_hierarchy where level_1_manager_name < > @man_name AND level_2_manager_name = @man_name 
UNION 
Select 'Manager_Level_3' from manager_hierarchy where level_2_manager_name < > @man_name AND level_3_manager_name = @man_name 
) 
Where full_name = @man_name 

вы можете заполнить переменную @man_name через оператора выбора: DECLARE @man_name AS VARCHAR (50) SET @man_name = (SELECT FROM)

Если вы хотите, чтобы цикл по числу имен можно использовать курсор , или ты может забыть переменную и использовать JOIN в вашем обновлении.

+0

получил этот errorORA-06550: строка 1, столбец 9: PLS-00103: Встречающиеся символ «@man_name», когда ожидает одно из следующих действий: начинают функция прагму тип процедуры подтипа <идентификатор> <а двойные кавычки идентификатор с разделителем> текущий курсор delete существует до 06550. 00000 - "строка% s, столбец% s: \ n% s" * Причина: Обычно ошибка компиляции PL/SQL. * Действие: –

+0

PL/SQL может иметь различный синтаксис, мой ответ был для MS SQL Server, так как вопрос не был помечен. Возможно, у него будет время посмотреть на него позже. –

+0

Я использую разработчика oracle sql. –

Смежные вопросы