簡體   English   中英

連接表的SQL更新

[英]sql update with joined tables

說我有這個選擇語句:

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;

但是那不起作用

如果要一次更新管理員和用戶中的列,則應使用以下方法:

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

(如果這就是您要的!)

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
;

當然,這僅在聯接表構造可更新時才有效(對視圖也適用)。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM