2013-04-10 2 views
0

У меня есть 3 таблицы, с которыми я сейчас работаю. USER, WORKSTATION и USER_WORKSTATION (в основном временная таблица).SQL для обновления таблицы на основе информации в 2 других таблицах

Мой

USER таблица состоит из user_iduser_name и,

WORKSTATION состоит из workstation_id, workstation_name и user_id.

На данный момент столбец user_id пуст для всех рабочих станций, и это моя проблема.

Я создал таблицу (импортированную из excel) USER_WORKSTATION. Он состоит только из user_name s и их соответствующих рабочих станций. Есть ли что-то, что я могу написать запрос на обновление, который обновит таблицу WORKSTATION с помощью user_id, найденного в таблице USER, на основе комбинаций user_name и workstation_name в таблице USER_WORKSTATION? У меня нет каких-либо ограничений в настоящее время, и я использую Oracle.

+0

@N West Я пробовал СОЕДИНЕНИЯ, но подошел пустой. обновить рабочую станцию ​​(выберите lic_user.user_name FROM lic_user JOIN lic_combo ON lic_user.user_name = lic_combo.user_name) set workstation.user_id = lic_user.user_id; – gward

+0

Извините, забыли, что вам нужно использовать немного другой синтаксис в oracle. Ответ в минуту :-) –

ответ

1

Вы можете использовать оператор MERGE для этого:

MERGE 
INTO WORKSTATION W1 
USING (SELECT W2.rowid AS rid, U.user_id 
      FROM USER_WORKSTATION UW 
      JOIN USER U 
      ON UW.user_name = U.user_name 
      JOIN WORKSTATION W2 
      ON UW.workstation_name = W2.workstation_name 
     ) q 
ON  (W1.rowid = q.rid) 
WHEN MATCHED THEN 
UPDATE 
SET W1.user_id = q.user_id; 

Вы можете сделать UPDATE, а также, это немного хаотичным.

См Update statement with inner join on Oracle

+0

Я ценю вашу быструю помощь @N West, но я боюсь, что этот ответ смутил меня больше. Почему аббревиатуры букв? – gward

+0

Это просто добавление псевдонима к таблицам для удобства использования. http://www.w3schools.com/sql/sql_alias.asp. –

+0

По сути, оператор MERGE принимает результат в предложении USING, присоединяет его к таблице в предложении INTO, а 'WHEN MATCHED THEN UPDATE' сообщает базе данных обновлять строки, которые соответствуют заданной операции' SET'. –

0

Привет попробовать этот PLSQL блок. Предположим, что одна пользовательская рабочая станция.

Declare 
user_id User.userid%type; 
ws_name WorkStationUser.wsname%type; 
Cursor WSUSER is select * from WorkStationUser; 
user_name WorkStationUser.username%type; 

Begin 

Open WSUSER; 


Loop 
Fetch WSUSER into user_name, ws_name; 
select userid into user_id from USER where username=user_name; 
select wsname into ws_name from WORKSTATIONUSER where username=user_name; 
update WORKSTATION set userid=user_id whrer wsname=ws_name; 
EXIT WHEN WSUSER%notfound; 
END LOOP; 
close WSUSER; 
END; 
+0

Пожалуйста, не используйте курсоры, если работает простой оператор SQL !!! Настраиваемая обработка - это то, что делают РСУБД! –

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