пример - Как я могу выполнить инструкцию UPDATE с JOIN в SQL?




update with join mysql (10)

MySQL

Вы получите максимальную производительность, если забудете предложение where и поместите все условия в выражение ON.

Я думаю, что это потому, что запрос сначала должен присоединиться к таблицам, а затем выполняет предложение where, поэтому, если вы можете уменьшить то, что требуется для присоединения, то это быстрый способ получить результаты / сделать udpate.

пример

сценарий

У вас есть таблица пользователей. Они могут войти в систему, используя свое имя пользователя или адрес электронной почты или номер учетной записи. Эти учетные записи могут быть активными (1) или неактивными (0). Эта таблица имеет 50000 строк

Затем у вас есть таблица пользователей, которая может отключиться, потому что вы обнаружите, что все они сделали что-то плохое. Однако в этой таблице имеется один столбец с именами пользователей, электронной почты и номера счетов. Он также имеет индикатор «has_run», который должен быть установлен в 1 (true), когда он был запущен

запрос

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

аргументация

Если бы нам пришлось присоединяться только к условиям OR, по существу, нужно было бы проверять каждую строку 4 раза, чтобы увидеть, должно ли оно присоединиться, и потенциально вернуть намного больше строк. Однако, предоставляя ему больше условий, он может «пропустить» много строк, если они не отвечают всем условиям при присоединении.

бонус

Это более читаемо. Все условия находятся в одном месте, а строки для обновления находятся в одном месте

Мне нужно обновить эту таблицу в SQL Server 2005 данными из ее родительской таблицы, см. Ниже:

продажа

id (int)
udid (int)
assid (int)

уд

id  (int)
assid  (int)

sale.assid содержит правильное значение для обновления ud.assid .

Какой запрос будет делать это? Я думаю об join но я не уверен, что это возможно.


Postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

Для SQLite используйте свойство RowID для обновления:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');

Другой пример, почему SQL не очень портативен.

Для MySQL это будет:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

Для получения дополнительной информации прочитайте несколько обновлений таблицы: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

Синтаксис строго зависит от того, какую СУБД SQL вы используете. Вот несколько способов сделать это в ANSI / ISO (он же должен работать на любой СУБД SQL), MySQL, SQL Server и Oracle. Следует иметь в виду, что мой предложенный метод ANSI / ISO обычно будет намного медленнее, чем два других метода, но если вы используете СУБД SQL, отличную от MySQL, SQL Server или Oracle, то это может быть единственный способ (например, если ваша СУБД SQL не поддерживает MERGE ):

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL Server:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

Oracle:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

Следующий оператор с ключевым словом FROM используется для обновления нескольких строк с помощью соединения

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

Упрощенный запрос на обновление с использованием JOIN- подключения нескольких таблиц.

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

Примечание. First_table, second_table, third_table и some_column как 123456 - это имена демонстрационных таблиц, имена столбцов и идентификаторы. Замените их действительными именами.


Это должно работать в SQL Server:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID






sql-update