В качестве операции на основе набора:
INSERT attire_tab(outfit,outfit_val)
SELECT
rec1.outfit_code,
case
when rec1.outfit_code = 'color'
case when tabc.member is not null then 'gold' else '' end
else 'other'
end
FROM
premium_tab rec
CROSS JOIN
default_tab rec1
LEFT JOIN
tabC
ON
tabc.member=rec.user and tabc.member_levl=rec.levl
Несколько преимуществ этого подхода:
Тот, который вы пишете в запросе выбора (комментарий ставит строку INSERT во время разработки), который по существу воплощаетвесь блок данных, который вы хотите вставить - это легко сделать в инструменте запросов, он доступен только для чтения, его можно запускать несколько раз и тестировать, доводить до совершенства без необходимости писать код sproc, запускать sproc, выбирать из таблицы впроверить, стереть таблицу обратно в исходное состояние, изменить sproc, снова запустить sproc "
Два, что обработчик запросов базы данных свободен для оптимизации запроса, как ему нравится, вместо того, чтобы выполнять запрос в наборе шаговвынужден построчным характером кода sproc.Почти всегда лучше избегать построчных операций в пользу блоков данных.Если в rec и rec1 по тысяче строк каждая, существующий запрос может быть выполнен миллион раз.Если бы в tabc было только 100 строк, было бы быстрее выполнить объединение с существующими данными, чтобы найти крошечную долю строк, которые относятся к члену, чем миллион раз попасть в таблицу или ее индекс (тысяча повторений из тысячипоиски)
и предупредительная записка;если отношение между rec и tabc равно m: m, то левое соединение вызовет умножение строк, известное как декартово произведение.Для обработки этого случая потребуется дополнительная осторожность, потому что существующий маршрут только спрашивает, есть ли у записи какая-либо одна совпадающая строка табов, но этот маршрут объединяет их.Первоначально я считал, что конкретный премиум-ряд будет относиться только к одному члену, поэтому левое соединение безопасно для использования