Эффективное добавление строк в SQL без использования курсора
Быстрый ответ
Запрос INSERT INTO ... SELECT позволяет быстро передать данные из одной таблицы в другую:
-- Это не клонирование! Это олицетворение синтаксиса INSERT INTO...SELECT!
INSERT INTO целевая_таблица (колонка1, колонка2)
SELECT колонка1, колонка2
FROM исходная_таблица
WHERE условия;
Обратите внимание на соответствие колонок в целевой таблице и результатов запроса SELECT. Также возможно добавить статические значения, например id_портфолио
, просто указав их в запросе SELECT:
-- Пришло время для операции SIU (Select Insert Update)!
INSERT INTO инвестиции (id_портфолио, дата_инвестирования, сумма)
SELECT 123 as id_портфолио, GETDATE() as дата_инвестирования, сумма
FROM временные_инвестиции;
Помните, что id_портфолио
не будет меняться позже, GETDATE() устанавливает текущее время, а NULL подходит для первоначального заполнения тех полей, которые не требуют данных сразу.
Операции с наборами данных против курсоров
Преимущества наборов данных перед курсорами
В SQL предпочтение отдаётся операциям с наборами данных из-за их высокой производительности по сравнению с курсорами, обрабатывающими строки по одной, что менее эффективно при работе с большими объёмами данных:
- Наборы данных: Обработка множества строк за одну операцию! 🎯
- Курсоры: Постепенная обработка данных с отставанием по скорости! 🐢
Улучшение производительности
- Убедитесь, что порядок колонок в списках
INSERT
иSELECT
совпадает, это упростит процесс вставки. - Исключите из запроса SELECT неиспользуемые колонки для упрощения вставки данных.
- Работа с таблицами без ограничений и индексов во время вставки данных ускорит процесс. Удалите их перед вставкой и восстановите после.
Excel VBA для автоматизации
Быстрое создание SQL-запросов
С помощью Excel VBA можно эффективно генерировать SQL-запросы:
-- Строим SQL-запросы как строковые выражения
Dim sqlStatement As String
sqlStatement = "INSERT INTO имя_таблицы (колонка1, колонка2) VALUES ('" & cellValue1 & "', '" & cellValue2 & "')"
Безопасность на первом месте: Проверьте входные данные, чтобы избежать SQL-инъекций.
Применение VBA
- Используйте VBA для экспорта данных из Excel в SQL 🚁.
- Если необходимо выполнить одиночную ETL-операцию, VBA станет отличным решением.
Альтернативы курсорам
Массовая вставка данных
Используйте BULK INSERT, bcp или OPENROWSET для массового переноса данных, если источником является текстовый файл.
Табличные конструкторы
Конструкторы табличных значений подходят для вставки небольшого количества строк без использования громоздких SELECT-запросов:
-- Заполняем таблицу данными без лишних сложностей!
INSERT INTO целевая_таблица (колонка1, колонка2)
VALUES ('значение1', 'значение2'), ('значение3', 'значение4'), ...;
Применение оператора MERGE
MERGE
объединяет операторы INSERT
, UPDATE
и DELETE
. Это мощный инструмент может значительно упростить ваш код.
Визуализация
Представьте SQL как процесс упаковки каждой записи из SELECT
в INSERT
, как очередную готовую к отправке посылку:
SELECT (Запись 📄) -> INSERT INTO (Посылка 📦)
📄 -> 🏭 -> 📦
Каждый раз, когда вы выполняете запрос SELECT, вы собираете записи (строки), которые затем подготавливаются и упаковываются в "коробку" INSERT. Может быть не так грандиозно, как вы могли бы представить, но это наглядный пример!
Полезные материалы
- SQL INSERT INTO SELECT Statement — подробное руководство по синтаксису и особенностям оператора INSERT INTO SELECT от W3Schools.
- Insert into ... values ( SELECT ... FROM ... ) — подборка полезных примеров и диалогов на Stack Overflow.
- PostgreSQL: INSERT — детальное изучение команды
INSERT
в документации PostgreSQL, включая варианты использования сSELECT
. - MySQL 8.0 Reference Manual: INSERT ... SELECT Statement — официальная документация MySQL, где более подробно описывается использование
INSERT ... SELECT
.