2012-02-08 92 views
0

說我有這個select語句:與連接表的SQL更新

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;

我可以單獨更新每個表或我可以創建像這樣一個觀點:

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; 

然而,這並不工作

+0

如果你想一次更新的管理員和用戶列然後看看這個:http://stackoverflow.com/questions/6362594/a-conditional- SQL更新語句換兩表一次刻錄。如果你只想更新管理員列中的基於用戶的連接,那麼看看這個:http://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-在-SQL。 – dash 2012-02-08 13:24:47

回答

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語句部分可以在連接上任何列的工作。

(如果這是你的要求!)

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 
; 

Ofcourse這隻會工作(同樣適用於視圖)如果連接表結構是可更新的。

+0

你的意思是'加入的表格構造是可更新的'。 – 2012-02-08 13:25:20

+0

並非所有連接都是可更新的,例如左連接將無法工作(該數據庫沒有PK來解決一行)。這與Views完全相同。 – 2012-02-08 13:35:33

0

你可能會做一些腳本(PLSQL),但我不相信你可以在一個SQL查詢中更新幾個表,而不是通過一個視圖。

PLSQL功能強大且不復雜,可以由數據庫事件觸發。