В SQL Server я могу сделать что-то вроде этого:
UPDATE tbl1
SET col2 = tbl2.col2
FROM table1 tbl1
INNER JOIN table2 tbl2
ON tbl1.col1 = tbl2.col1
Я не удосужился посмотреть, является ли это частью какого-либо стандарта SQL или нет, и я уверен, что есть другие способы сделать это, но это поразительно полезно.
Вот моя проблема. Мне нужно сделать что-то похожее на в SQL (т.е. не на языке хоста) с SQLITE3. Это можно сделать?


Я обнаружил, что это можно сделать с помощью INSERT OR REPLACE INTO. Немного более подробный, чем эквивалент T-SQL, но такой же удобный.
@HannesdeJager Ознакомьтесь с новым ответом, я нашел решение.
Как бы то ни было, Microsoft SQL Server и MySQL - единственные марки баз данных, которые поддерживают обновления нескольких таблиц, и синтаксис, который они используют, не похож.
Эта функция не является частью стандартного SQL. Поэтому неудивительно, что поддержка обновления (и удаления) нескольких таблиц нестандартна и не поддерживается многими брендами.
В любом случае, я рад, что вы нашли решение, подходящее для вашей задачи.
Разве SQL Server и MySQL вместе взятые не представляют собой очень большую часть всех баз данных в производстве? Я предполагаю, по крайней мере, две трети, а другой может быть какой-нибудь Oracle. Этот комментарий создает впечатление "необычного" запроса, но на самом деле он поддерживается большинством баз данных prod.
@Tommy, поскольку синтаксис обновления нескольких таблиц Microsoft несовместим с синтаксисом обновления нескольких таблиц MySQL, я не думаю, что будет справедливо сгруппировать их вместе.
Это работает для sqlite:
UPDATE tbl1 SET col2 = (SELECT col2 FROM tbl2 WHERE tbl2.col1 = tbl1.col1)
не очень полезно, если у вас есть несколько столбцов, которые вы хотите установить из одной строки во второй таблице.
@Michael отлично отвечает на его вопрос, если у вас есть другая проблема, которую вы хотите решить, задайте новый вопрос.
Но будьте осторожны, это установит для столбца tbl1 Col2 значение null, если в tbl2 не найдена соответствующая строка.
что произойдет, если внутренний запрос вернет> 1 строку?
Просто чтобы подчеркнуть сообщение Геогори Хигли:
У меня были проблемы с UPDATE tbl1 SET col2 = (SELECT col2 FROM tbl2 WHERE tbl2.col1 = tbl1.col1), когда он обновляет столбцы в tbl1, которых нет в tbl2.
см. сообщение гепарда на http://sqlite.phxsoftware.com/forums/p/1708/7238.aspx, которое указывает на:
http://www.mail-archive.com/[email protected]/msg27207.html
Код такой:
insert or replace into foo (id, name, extra)
select bar.id, bar.name, foo.extra
from bar
left join foo
on bar.id = foo.id;
и это, кажется, работает правильно. Кажется, что на разных сайтах есть много сообщений, рекомендующих первый подход, так что это немного сбивает с толку. Я бы посоветовал вам очень внимательно проверить результат, если вы используете этот метод, который кажется более быстрым и может работать с сопоставленными таблицами.
«У меня возникли проблемы с UPDATE tbl1 SET col2 = (SELECT col2 FROM tbl2 WHERE tbl2.col1 = tbl1.col1), где он обновляет столбцы в tbl1, которых нет в tbl2.» Как вы можете обновить столбец в таблице 1 до столбец в tbl2, которого нет в tbl2 ?? разве этот запрос не немного недействителен?
Вы можете предложить свое решение?