Как я могу выполнить инструкцию 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;