2013-04-10 73 views
0

我有3个表格,我目前正在使用。 USER,WORKSTATIONUSER_WORKSTATION(基本上是临时表)。SQL根据另外两个表中的信息更新表格

USER表由user_iduser_name

WORKSTATIONworkstation_idworkstation_nameuser_id

截至目前,所有工作站的user_id列都是空的,这是我的问题。

我创建了一个表格(从Excel导入)USER_WORKSTATION。它仅由user_name及其相应的工作站组成。有没有办法,我可以写一个更新查询,根据USER_WORKSTATION表中的user_nameworkstation_name组合更新WORKSTATION表,user_id表中的user_id表找到USER表?我目前没有任何限制,我正在使用Oracle。

+0

@N West我一直在尝试JOIN,但一直空着。更新工作站(选择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 2013-04-10 19:04:39

+0

对不起,忘了你必须在oracle中使用稍微不同的语法。在一分钟内回答:-) – 2013-04-10 19:08:28

回答

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 2013-04-10 19:20:15

+0

这只是添加一个别名到表,以方便使用。 http://www.w3schools.com/sql/sql_alias.asp。 – 2013-04-10 19:23:46

+0

本质上,MERGE语句在USING子句中使用Resultset,并将它连接到INTO子句中的表,并且'WHEN MATCHED THEN UPDATE'告诉数据库更新与定义的'SET'操作匹配的行。 – 2013-04-10 19:25:05

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语句正常工作,请不要使用游标!基于集合的处理是RDBMS最擅长的! – 2013-04-10 19:26:46

相关问题