powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLIte и UPDATE SET из 2-х таблиц
10 сообщений из 10, страница 1 из 1
SQLIte и UPDATE SET из 2-х таблиц
    #36903997
Fireword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток! Помогите разрешить пролемку пожалуйста.
Есть база с 2-мя таблицами:
В 1-й ( strings ) поле name (текстовый идентификатор не уникален) и body (текст - переведенное с английского наименование)
В 2-й ( items ) поле desc (текстовый идентификатор не уникален) rus (будущий текст из поля body таблицы 1) и несколько других полей....
Задача перенести из strings.body в items.rus данные в соответствии с полем items.name = strings.name .
Пробовал так:
Код: plaintext
1.
2.
3.
UPDATE items i, strings s
SET rus = s.body 
where i."desc" = s.name  
Бился неделю, в мускуле все работает, а как только дело доходит до лайта то ругань сначала по причине 2-х таблиц в UPDATE, а затем и по всему остальному. Понимаю что решается все вложенными запросами, но как реализовать эти самые запросы ума не приложу.
Заранее спасибо.
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36904032
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fireword,

1)

если у вас в strings нет уникального идентификатора, то как вы вообще собираетесь переносить данные?...

т.е. для 'str1' может быть два значения 'green', 'red'

Какое из значений должно оказаться в items ?


2) пишете про items.name = strings.name , а в запросе указываете i."desc" = s.name ...


Обновить данные можно, если есть уникальный идентификатор

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
sqlite> create table strings (name text primary key, body text);
sqlite> create table items (name text primary key, desc text, rus text);
sqlite>
sqlite> insert into items values ('name1', 'desc1', 'old_text');
sqlite> insert into items values ('name2', 'desc2', 'old_text');
sqlite> insert into items values ('name3', 'desc3', 'old_text');
sqlite> insert into strings values ('name3', 'русский3');
sqlite> insert into strings values ('name2', 'русский2');
sqlite>
sqlite> select * from items;
name1|desc1|old_text
name2|desc2|old_text
name3|desc3|old_text
sqlite>
sqlite> replace into items (name, desc, rus)
   ...> select i.name, i.desc, s.body
   ...>   from items i
   ...>   join strings s on s.name = i.name;
sqlite>
sqlite> select * from items;
name1|desc1|old_text
name2|desc2|русский2
name3|desc3|русский3
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36904039
Fireword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tolka , спасибо большое за помощь, сейчас буду проверять.
По поводу уникальности скажу что ошибся вернее копипаст - зло, в таблице strings значения name конечно же уникальны, но опомнился после того как создал тему.
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36926403
Fireword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Опять возникла проблемма, не работает запрос

Код: plaintext
1.
2.
UPDATE items
SET detail = (select e.detail from export e where name = e.name)

По сути таблица export имеет 3 поля (id (primary), name, detail) - периодически обновляемая, из ее и происходит загрузка некоторых строк в таблицу items , сама же items имеет большое количество полей (id -primary) но связь с другими только по полю name .
Ума не приложу, после выполнения запроса во всех строках поля items.name значение первой записи export.detail Пробовал join-oм:
Код: plaintext
1.
2.
UPDATE items
SET detail = (select e.detail from export e join items i on i.name = e.name)

Но результат тот - же. Не пойму в чем дело, ведь свою первую проблемму в первом посте поборол именно таким запросом. Подскажите пожалуйста где проблемма.
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36926515
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет в sqlite возможности проводить апдейт подзапросами.

sqliteThe modifications made to each row affected by an UPDATE statement are determined by the list of assignments following the SET keyword. Each assignment specifies a column name to the left of the equals sign and a scalar expression to the right

Ваш подзарос поле name рассматривает как поле в таблице export . При этом он выбирает первую строку и присваивает её значение всем строкам в таблице items
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36926528
Fireword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tolka , в очередной раз большое спасибо, опять выручили))
Как я мог про это забыть, переименовал поле и все пошло как надо
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36926537
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всмысле

Код: plaintext
1.
2.
UPDATE items
SET detail = (select e.detail from export e where new_name_in_items = e.name)

сработало???
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #36926586
Fireword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да только имя поля менял в таблице export как то так)), еще раз спасибо
Код: plaintext
1.
UPDATE items
SET detail = (select e.detail from export e where name = e.new_name_in_items)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
SQLIte и UPDATE SET из 2-х таблиц
    #39021572
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема старая, но может кому пригодится...

"CREATE TABLE IF NOT EXISTS TBL1 (Col1 UNIQUE, Col2);"
"CREATE TABLE IF NOT EXISTS TBL2 (Col1 UNIQUE, Col2);"


'BEGIN;')
"INSERT INTO TBL1 VALUES ('1', 'a');"
"INSERT INTO TBL1 VALUES ('2', 'b');"
"INSERT INTO TBL1 VALUES ('3', 'c');"
"INSERT INTO TBL1 VALUES ('4', 'd');"
"INSERT INTO TBL1 VALUES ('6', 'f');"
"INSERT INTO TBL1 VALUES ('11', 't');"
"INSERT INTO TBL1 VALUES ('7', 'h');"

"INSERT INTO TBL2 VALUES ('1', '');"
"INSERT INTO TBL2 VALUES ('2', '');"
"INSERT INTO TBL2 VALUES ('3', '');"
"INSERT INTO TBL2 VALUES ('4', '');"
"INSERT INTO TBL2 VALUES ('6', '');"
"INSERT INTO TBL2 VALUES ('7', '');"
"INSERT INTO TBL2 VALUES ('11', '');"
'COMMIT;')

Данный запрос отрабатывает как нужно
"UPDATE TBL2 SET Col2 = (SELECT TBL1.Col2 FROM TBL1 WHERE TBL2.Col1=TBL1.Col1) ;"

А этот выставляет всем строкам одинаковое значение
"UPDATE TBL2 SET Col2 = (SELECT TBL1.Col2 FROM TBL1, TBL2 WHERE TBL2.Col1=TBL1.Col1) ;"

Это я получил методом научного тыка после прочтения данного поста.
Интересно было бы узнать логику, если кто-то сможет схематично объяснить, было бы хорошо
...
Рейтинг: 0 / 0
SQLIte и UPDATE SET из 2-х таблиц
    #39022438
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё ж ясно как белый день.
В первом случае, подзапрос связан с внешним запросом:
Код: plaintext
1.
2.
3.
4.
5.
UPDATE TBL2 
SET Col2 = (
  SELECT TBL1.Col2 
  FROM TBL1 
  WHERE TBL2.Col1=TBL1.Col1) ;
Во втором случае, подзапрос варится в собственном соку и "кладёт на вашего Тихонова с прибором":
Код: plaintext
1.
2.
3.
4.
5.
UPDATE TBL2 
SET Col2 = (
  SELECT TBL1.Col2 
  FROM TBL1, TBL2 
  WHERE TBL2.Col1=TBL1.Col1) ;
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLIte и UPDATE SET из 2-х таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]