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

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

продажа

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

уд

id  (int)
assid  (int)

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

Ответы

Ответ 1

Синтаксис строго зависит от используемой СУБД 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

Ответ 2

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

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

Ответ 3

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 

Ответ 4

Стандартный SQL-подход будет

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

В SQL Server вы можете использовать соединение

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

Ответ 5

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;

Ответ 6

Упрощенный запрос на обновление с помощью 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 - это имена демонстрационных таблиц, имена столбцов и идентификаторы. Замените их допустимыми именами.

Ответ 7

Еще один пример, почему 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]

Ответ 8

Teradata Aster предлагает еще один интересный способ достижения цели:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

Ответ 9

Я думал, что SQL-Server один из лучших сообщений будет работать для Sybase, поскольку они оба являются T-SQL, но, к сожалению, нет.

Для Sybase я обнаружил, что обновление должно быть на самой таблице, а не на псевдониме:

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

И в MS ACCESS:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;