У меня есть две таблицы с одинаковым столбцом с именем user_name, говорящие table_a, table_b.
Я хочу, скопировать из table_b, column_b_1, column_b2, в table_b1, column_a_1, column_a_2, соответственно, где user_name одинаково, как это сделать в sql-заявлении?
Пока у вас есть подходящие индексы, это должно работать нормально:
UPDATE table_a
SET
column_a_1 = (SELECT table_b.column_b_1
FROM table_b
WHERE table_b.user_name = table_a.user_name )
, column_a_2 = (SELECT table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name )
WHERE
EXISTS (
SELECT *
FROM table_b
WHERE table_b.user_name = table_a.user_name
)
UPDATE в sqlite3 не поддерживает предложение FROM, что делает это немного больше работы, чем в других СУБД.
Если производительность не является удовлетворительной, другой вариант может заключаться в создании новых строк для table_a, используя команду select и join with table_a во временную таблицу. Затем удалите данные из таблицы_a и повторно запишите из временного.
Существует даже гораздо лучшее решение для обновления одной таблицы из другой таблицы:
;WITH a AS
(
SELECT
song_id,
artist_id
FROM
online_performance
)
UPDATE record_performance
SET
op_song_id=(SELECT song_id FROM a),
op_artist_id=(SELECT artist_id FROM a)
;
user_name
в исходном вопросе). Вместо этого будут установлены все соответствующие значения в обновляемой таблице на значения только одной записи в исходной таблице. Попытался перечислить общий столбец и добавить условие WHERE
, но это не сработало.
Начиная с sqlite версии 3.15, синтаксис UPDATE допускает список имен столбцов в части SET, чтобы запрос можно было записать как
UPDATE table_a
SET
(column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name )
WHERE
EXISTS (
SELECT *
FROM table_b
WHERE table_b.user_name = table_a.user_name
)
который не только короче, но и быстрее
column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )