У меня есть сценарий для извлечения определенных данных из гораздо большей таблицы, при этом одно поле, в частности, регулярно меняется, например
SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3
THEN t.field3 END as field,
...[A bunch of other fields]
FROM table t
Однако проблема в том, что теперь я хочу выполнить другую обработку данных. Я пытаюсь придумать самый эффективный метод. Мне нужно каким-то образом передать флаг, поэтому я знаю, что говорю о данных, нарезанных правым полем.
Одно из возможных решений, с которым я немного поиграл (в основном, чтобы увидеть, что произойдет), - это выгрузить содержимое скрипта в табличную функцию, которой передан флаг, а затем использовать запрос SELECT для результатов функции . Мне удалось заставить его работать, но он значительно медленнее, чем ...
Очевидное решение и, вероятно, наиболее эффективное использование циклов процессора: создать серию кеш-таблиц, по одной для каждого из трех значений флагов. Однако тогда проблема состоит в том, чтобы найти способ извлечения данных из правой таблицы кэша для выполнения вычислений. Очевидный, хотя и неверный ответ будет примерно таким:
SELECT CASE @Flag WHEN 1 THEN table1.field WHEN 2 THEN table2.field WHEN 3
THEN table3.field END as field,
...[The various calculated fields]
FROM table1, table2, table3
К сожалению, как очевидно, это создает массивное перекрестное соединение, что совсем не является моим предполагаемым результатом.
Кто-нибудь знает, как превратить это перекрестное соединение в «Только посмотрите на таблицу x»? (Без использования динамического SQL, что усложняет работу?) Или альтернативное решение, которое все еще достаточно быстрое?
Обновлено: Независимо от того, веская причина или нет, идея, которую я пытался реализовать, заключалась в том, чтобы не было трех в основном идентичных запросов, которые различаются только таблицей, которые затем нужно было бы редактировать одинаково всякий раз, когда в логику вносятся изменения. Вот почему я до сих пор избегал фразу «Сделать флаг полностью отдельным» ...


Я думаю, вам нужно полностью исключить @Flag из запроса и использовать его, чтобы решить, какой из трех отдельных операторов SELECT запускать.
Если ваш запрос такой же простой, как вы его там показали ... это действительно лучший ответ.
Кажется, вы сосредотачиваете свое внимание на технологии, а не на проблеме, которую нужно решить. Подумайте об одном выборе из основной таблицы для каждого случая - как вы это описываете здесь, не так ли?
Как насчет UNION ALL для каждого значения FLAG.
В предложение where первого бита включают:
AND @flag = 1
Хотя комментарий о запуске разных операторов выбора для разных значений флагов также имеет для меня смысл.
Решение этой проблемы с помощью UNION ALL означало бы повторение большей части SQL-запроса, чего, по словам Маргарет, она пыталась избежать.
Более простое решение, предложенное товарищем по работе:
SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3
THEN t.field3 END as field,
[A bunch of other fields],
@Flag as flag
FROM table t
Затем основывайте принятие решения на последнем поле. Намного проще, и, вероятно, мне в первую очередь следовало бы подумать.
Усилия, которые вы тратите, пытаясь объединить это в один запрос, лучше потратить на выполнение работы.