ОБНОВЛЕНИЕ кросс-таблицы в SQLITE3

В SQL Server я могу сделать что-то вроде этого:

UPDATE tbl1 
   SET col2 = tbl2.col2 
  FROM table1 tbl1 
 INNER JOIN table2 tbl2 
    ON tbl1.col1 = tbl2.col1

Я не удосужился посмотреть, является ли это частью какого-либо стандарта SQL или нет, и я уверен, что есть другие способы сделать это, но это поразительно полезно.

Вот моя проблема. Мне нужно сделать что-то подобное в SQL (т. е. не на основном языке) с SQLITE3. Можно ли это сделать?


person Gregory Higley    schedule 30.11.2008    source источник


Ответы (4)


Это работает для sqlite:

UPDATE tbl1 SET col2 = (SELECT col2 FROM tbl2 WHERE tbl2.col1 = tbl1.col1)
person Trey Jackson    schedule 24.03.2010
comment
не очень полезно, если у вас есть несколько столбцов, которые вы хотите установить из одной строки во второй таблице. - person Michael; 03.06.2012
comment
@Michael, он отлично отвечает на его вопрос, если у вас есть другая проблема, которую вы хотите решить, задайте новый вопрос. - person Trey Jackson; 03.06.2012
comment
Но будьте осторожны, это установит столбец tbl1 в значение null, если в tbl2 не будет найдена соответствующая строка. - person Durai Amuthan.H; 12.01.2014
comment
что произойдет, если внутренний запрос вернет 1 строку? - person rayzinnz; 30.06.2017

Просто чтобы подчеркнуть сообщение Гегори Хигли:

У меня были проблемы с 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;

и это, кажется, работает правильно. Кажется, на разных сайтах есть много сообщений, которые рекомендуют первый подход, поэтому он немного сбивает с толку. Я бы посоветовал вам очень тщательно проверить свой вывод, если вы используете этот метод, который кажется более быстрым и может работать с совпадающими таблицами.

person apjs    schedule 01.01.2013
comment
У меня были проблемы с UPDATE tbl1 SET col2 = (SELECT col2 FROM tbl2 WHERE tbl2.col1 = tbl1.col1), где он обновляет столбцы в tbl1, которые не существуют в tbl2. как вы можете обновить столбец в таблице 1 до столбца в tbl2, которого нет в tbl2?? не является ли этот запрос немного недействительным? - person Tommy; 20.03.2013
comment
Это решение опасно! для этого требуется, чтобы таблицы foo и bar имели одинаковое количество столбцов, иначе он заменит любые дополнительные поля в таблице foo на NULL. - person Awad Haj; 03.04.2021

Я обнаружил, что это можно сделать с помощью INSERT OR REPLACE INTO. Немного более подробный, чем эквивалент T-SQL, но такой же удобный.

person Gregory Higley    schedule 30.11.2008
comment
Можете ли вы предоставить свое решение? - person Hannes de Jager; 27.11.2009
comment
@HannesdeJager Посмотрите новый ответ, я нашел решение. - person Trey Jackson; 24.03.2010

Как бы то ни было, Microsoft SQL Server и MySQL — единственные бренды баз данных, которые поддерживают многотабличные обновления, и синтаксис, который они используют, не похож.

Эта функция не является частью стандартного SQL. Поэтому неудивительно, что поддержка обновления (и удаления) нескольких таблиц нестандартна и не поддерживается многими брендами.

В любом случае, я рад, что вы нашли решение, которое подходит для вашей задачи.

person Community    schedule 30.11.2008
comment
Разве SQL Server и MySQL вместе взятые не составляют очень большую часть всех баз данных в производстве? Я бы предположил, по крайней мере, две трети, возможно, какой-нибудь Оракул. Из-за этого комментария запрос кажется необычным, но на самом деле он поддерживается большинством баз данных prod. - person Tommy; 20.03.2013
comment
@Tommy, поскольку синтаксис обновления нескольких таблиц Microsoft несовместим с синтаксисом обновления нескольких таблиц MySQL, я не думаю, что будет справедливо группировать их вместе. - person Bill Karwin; 20.03.2013