|
|
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Доброе утро! Сломал голову себе, целый день вчера потратил на решение. В итоге так и не победил. Может подскажите, может все гораздо проще и я что-то упустил? :) И так, имеется три таблицы: 1 - таблица сотрудников ( users ), в которой указан также "ID должности" ( id,position_id ) 2 - таблица должностей соответственно ( positions ), с полями id,position 3 - таблица ( xls ) в которую поступают актуальные данные из *.xls файла, в которой также содержится столбец "Должности" Но не "ID должности", а именно "Название должности" ( position ). Так вот, задача в следующем! нужно из таблицы xls обновить таблицу сотрудников ( users ), точнее их должности (если не совпадают), НО! т.к. в тбл. xls идет "Название должности" ( position - varchar()), а в тбл. users "ID должности" ( position_id int()), требуется сравнить сначала: xls . position с positions . position и затем position . id сравнить с users . position_id . SELECT запрос я сделал - работает ! А вот как его преобразовать в UPDATE - не могу сообразить! по сути проблема у меня только во вложенном селекте, который выводит новую должность. SELECT u.id,(SELECT id FROM positions WHERE position=x.position LIMIT 1) AS position_id FROM users AS u LEFT JOIN xls AS x ON u.id=x.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>x.position Выводит 4 строки (правильно, у 4х сотрудников сменилась должность): id сотрудника и новая должность также работает этот UPDATE, НО нужно вместо цифры(33) подставить как то вот это (SELECT id FROM positions WHERE position=x.position LIMIT 1) UPDATE users AS u INNER JOIN( select u.id FROM users AS u LEFT JOIN xls AS x ON u.id=x.id LEFT JOIN positions AS p ON u.position_id=p.id WHERE p.position<>x.position ) AS result USING(id) SET position_id=33 Сдесь должен быть (SELECT id FROM positions WHERE position=x.position LIMIT 1) WHERE u.id=result.id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 05:45 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Покажите DDL всех трёх таблиц, пример их содержимого, и результат на именно этих данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 07:36 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Akina, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plsql 1. 2. 3. 4. 5. 6. 7. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plsql 1. 2. НУЖЕН UPDATE Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 10:57 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. fiddle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 11:15 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Akina, Огромнейшее Вам спасибо!!! Все работает :) Не особо хорошо понимаю в сложных UPDATE'х, но вы все расставили по своим местам ;) PS: Последняя закоментная строчка, я так понимаю, что будет обновлять только те строки, которые не совпадают? И по поводу сравнения строк, можно же сделать сравнения только по id ? в Моем случае id привязаны к сотрудникам (табельный номер) и совпадают у сотрудников в обеих таблицах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 12:23 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
xxx-luПоследняя закоментная строчка, я так понимаю, что будет обновлять только те строки, которые не совпадают?Ну в реальности оно по-любому так будет (rows matched !== rows affected)... но последняя строка, если её раскомментировать, уменьшит количество попыток обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 12:35 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
xxx-luможно же сделать сравнения только по id ?Да пожалуйста... будет только WHERE users.id = xls.id. С точки зрения нормализации это даже где-то правильно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 12:37 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Akinaxxx-luможно же сделать сравнения только по id ?Да пожалуйста... будет только WHERE users.id = xls.id. С точки зрения нормализации это даже где-то правильно... :) Хочу еще обновлять фамилии сотрудников с одним ID, ведь женщинам свойственно их менять :) Интересно, что будет быстрее работать, да и в целом как грамотнее (правильнее): Один запрос на обновление всех записей Код: plsql 1. 2. 3. ЛИБО два разных запроса, но именно по отличающимся данным Код: plsql 1. 2. 3. 4. 5. И Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 13:08 |
|
||
|
Обновление данных из трех таблиц!
|
|||
|---|---|---|---|
|
#18+
Один запрос, вне всякого сомнения, лучше. И хрен с ими, что совпадают... всё равно проверка на совпадение - будет, и какая разница, будет это в секции отбора, или уже при обновлении при принятии решения, надо записывать блок на диск, или он фактически не изменился... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 13:47 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39721305&tid=1829526]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 153ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...