2012-02-08 4 views
0

Скажем, у меня есть этот оператор выбора: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

ответ

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' 

НАБОРА заявление секция может работать на любой из столбцов в объединении.

(Если это то, что вы просите!)

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

Что вы подразумеваете под «объединенной табличной конструкцией, является обновляемой». –

+0

Не все JOINS являются обновляемыми, например. LEFT JOINS не будет работать (БД не имеет ПК для обращения к строке). Это одинаково для Views. –

0

Вы можете сделать некоторые сценарии (PLSQL), но я не верю, что вы можете обновлять несколько таблиц в одном SQL-запросе, кроме как через представление.

PLSQL является мощным и не сложным и может быть вызван событиями базы данных.

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