INSERT разными способами - MySQL
Формулировка задачи:
Добрый вечер! Помогите решить ещё одну задачку. В ней сразу несколько проблем.
есть таблица 1, в ней колонки: продукт, номер накладной и другие. В этой таблице все эти значения могут повторяться (и продукты и номера накадных), но не их пары. Номера накладных хранятся в таблице 2. То есть там они все, а в таблице 1 какого-то может не быть.
Нужно: найти и вставить строки из таблицы 1 с минимальным номером накладной из таблицы 2 в таблицу же 1, только при вставке вместо номера накладной из поиска чтобы там был максимальный номер накладной из таблицы 2. Загвозка в том как скомбинировать синтаксис INSERT ... SELECT с INSERT ... VALUE для всех столбцов кроме того, что надо задать явно максимальным значением таблицы 2.
И вторая проблема. Надо не просто вставить строки, а есть дополнительное условие, что если в таблице 1 уже существуют строки для максимального значения накладной, то продукты, найденные селектом и совпадающие с этими строками вставлять не надо.
Сложно это все представить, даже описывать сложно. Помогите...
Решение задачи: «INSERT разными способами»
textual
Листинг программы
INSERT INTO табл1 SELECT продукт, все остальные колонки, max(dmz.NDM) FROM табл1 JOIN табл2 WHERE продукт NOT IN ( SELECT продукт from табл1 JOIN табл2 GROUP BY продукт, табл1.номер накладной HAVING табл1.номер накладной = max(табл2.номер накладной) ) GROUP BY продукт, все остальные колонки, табл1.номер накладной HAVING табл1.номер накладной = min(табл2.номер накладной)
Объяснение кода листинга программы
Список шагов, которые делаются в коде:
INSERT INTO табл1
- код выполняет операцию вставки данных в таблицутабл1
.SELECT продукт, все остальные колонки, max(dmz.NDM)
- код выполняет операцию выборки данных из таблицытабл1
итабл2
. В выборку включаются столбцыпродукт
и все остальные столбцы, кромеdmz.NDM
. Значениеmax(dmz.NDM)
используется для заполнения столбцаdmz.NDM
в таблицетабл1
.FROM табл1
- код выбирает данные из таблицытабл1
.JOIN табл2
- код выполняет операцию объединения (JOIN) данных из таблицытабл2
по соответствующему условию.WHERE продукт NOT IN (SELECT продукт from табл1 JOIN табл2 GROUP BY продукт, табл1.номер накладной HAVING табл1.номер накладной = max(табл2.номер накладной))
- код выполняет фильтрацию данных, исключая из выборки те строки, где значение столбцапродукт
присутствует в списке, полученном в результате выполнения подзапроса.GROUP BY продукт, все остальные колонки, табл1.номер накладной
- код группирует данные по значению столбцапродукт
и всем остальным столбцам, кромеdmz.NDM
итабл1.номер накладной
.HAVING табл1.номер накладной = min(табл2.номер накладной)
- код выполняет фильтрацию данных, исключая из выборки те строки, где значение столбцатабл1.номер накладной
не равно минимальному значению столбцатабл2.номер накладной
. Таким образом, код выполняет операцию вставки данных в таблицутабл1
, используя данные из таблицытабл1
итабл2
. При этом происходит фильтрация данных, чтобы исключить дубликаты строк и оставить только те строки, где значение столбцатабл1.номер накладной
равно минимальному значению столбцатабл2.номер накладной
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д