带连接表的sql更新

时间:2012-02-08 13:12:40

标签: mysql sql-update

说我有这个选择声明:

SELECT ut.user_id,
       a.firstname,
       a.surname,
       u.username,
       u.email_address
  FROM administrators a 
  JOIN user_types ut JOIN users u ON a.admin_id = ut.type_id 
   AND u.user_id = ut.user_id AND ut.user_type = 'ADMIN';

说我想更新user_id = 1;

行中的所有值

我可以单独更新EACH TABLE或者我可以像这样创建一个视图:

CREATE OR REPLACE VIEW full_admin AS
SELECT ut.user_id,
       a.firstname,
       a.surname,
       u.username,
       u.email_address
  FROM administrators a 
  JOIN user_types ut 
  JOIN users u  on a.admin_id = ut.type_id 
   AND u.user_id = ut.user_id 
   AND ut.user_type = 'ADMIN'

然后我可以写:

UPDATE full_admin
   SET firstname = 'blah', etc, etc
 WHERE user_id = 1;

这将更新所有表中的所有行

有没有办法在不创建视图的情况下执行此操作?

类似的东西:

UPDATE (
    SELECT ut.user_id,
           a.firstname,
           a.surname,
           u.username,
           u.email_address
      FROM administrators a 
      JOIN user_types ut 
      JOIN users u ON a.admin_id = ut.type_id 
       AND u.user_id = ut.user_id 
       AND ut.user_type = 'ADMIN'
)
AS temp_table
  SET firstname = "ALEX"
WHERE user_id = 1;

然而,这不起作用

3 个答案:

答案 0 :(得分:1)

如果您想立即update columns in both管理员和用户,那么这样的事情应该可以解决问题:

UPDATE administrators a  
        INNER JOIN user_types ut ON a.admin_id = ut.type_id 
        INNER JOIN users u ON u.user_id = ut.user_id 
            SET u.firstname = "ALEX", a.SomeColumn = 'X' 
        WHERE u.user_id = 1 
                 AND ut.user_type = 'ADMIN' 

SET语句部分可以处理连接中的任何列。

(如果那就是你要问的那个!)

答案 1 :(得分:0)

UPDATE administrators a 
INNER JOIN user_types ut ON a.admin_id = ut.type_id
INNER JOIN users u ON u.user_id = ut.user_id AND ut.user_type = 'ADMIN'
SET u.firstname = "ALEX"
WHERE u.user_id = 1
;

当然,如果连接的表构造是可更新的,这只会起作用(同样适用于视图)。

答案 2 :(得分:0)

你可以做一些脚本(PLSQL),但我不相信你可以在一个SQL查询中更新几个表而不是通过视图。

PLSQL功能强大且不复杂,可以由数据库事件触发。