Выбор из разных таблиц через SQL в зависимости от флага - PullRequest
0 голосов
/ 30 октября 2008

У меня есть скрипт для извлечения определенных данных из таблицы намного большего размера, в частности одно поле регулярно меняется, например,

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, что усложняет задачу?) Или альтернативное решение, которое все еще достаточно быстрое?

РЕДАКТИРОВАТЬ: Независимо от того, является ли это хорошей причиной или нет, идея, которую я пытался реализовать, заключалась в том, чтобы не иметь трех в значительной степени идентичных запросов, отличающихся только таблицей, которые затем должны были бы редактироваться одинаково при каждом изменении логика. Вот почему я до сих пор избегал «иметь отдельный флаг» ...

Ответы [ 4 ]

5 голосов
/ 30 октября 2008

Я думаю, что вам нужно полностью извлечь @Flag из запроса и использовать его, чтобы решить, какой из трех отдельных операторов SELECT выполнить.

3 голосов
/ 30 октября 2008

Как насчет UNION ALL для каждого значения FLAG.

В предложении where первого бита указывается:

AND @flag = 1

Хотя комментарий о запуске разных операторов выбора для разных значений флага также имеет смысл для меня.

0 голосов
/ 17 февраля 2009

Более простое решение, предложенное коллегой по работе:

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

Затем основывайте решение на последнем поле. Намного проще, и, вероятно, мне следовало бы подумать.

0 голосов
/ 30 октября 2008

Вы, кажется, концентрируете свое внимание на технологии, а не на проблеме, которую нужно решить. Подумайте об одном выборе из основной таблицы для каждого случая - как вы это описываете здесь, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...