У меня есть скрипт для извлечения определенных данных из таблицы намного большего размера, в частности одно поле регулярно меняется, например,
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
К сожалению, как очевидно, это создает массивное перекрестное соединение - что вовсе не является моим предполагаемым результатом.
Кто-нибудь знает, как превратить это перекрестное объединение в "Только посмотрите на таблицу х"? (Без использования динамического SQL, что усложняет задачу?) Или альтернативное решение, которое все еще достаточно быстрое?
РЕДАКТИРОВАТЬ: Независимо от того, является ли это хорошей причиной или нет, идея, которую я пытался реализовать, заключалась в том, чтобы не иметь трех в значительной степени идентичных запросов, отличающихся только таблицей, которые затем должны были бы редактироваться одинаково при каждом изменении логика. Вот почему я до сих пор избегал «иметь отдельный флаг» ...