Как повторить разделы SQL-запроса через UNION? (СУХОЙ в SQL) - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть запрос, который возвращает результаты трех запросов UNION. Каждый запрос имеет длинную инструкцию выбора. Есть части выражения select, которые выглядят так:

coalesce(a.fact1,'Fact1'),
coalesce(b.fact1,'Fact2')
...

раздел from / join также огромен

from table1 t1
join table2 t2 on t1.id = t2.t1_id
join table3 t3 on t2.id = t3.t2_id

и т.д.. Каждый из этих блоков повторяется одинаково для всех трех операторов SELECT.

Мне было интересно, есть ли способ поместить этот кусок кода (или блок имен полей или блок операторов соединения) в место, где я мог бы ссылаться на них в одной строке. Вроде как мини-просмотр / функция, но просто служит заменой текста. Таким образом, я могу отредактировать эти вещи один раз и не нужно редактировать соответствующий бит каждого оператора выбора по отдельности.

Это в MSSQL. Есть ли способ сделать то, что я пытаюсь объяснить?


Обновление

select a.field1, b.field2, c.field3 
from table1 a 
  join table2 b on a.id = b.table1_id 
  join table3 c on b.id = c.table2_id 
where cond1 = 'Pos Condition' 
  AND cond2 = 'Test' 

union

select a.field1, b.field2, d.field3 
from table1 a 
  join table2 b on a.id = b.table1_id 
  join table3 c on b.id = c.table2_id 
  join table4 d on c.id = d.table3_id 
where cond1 = 'Pos Condition' 
  AND cond2 = 'Second Type of Result' 

Данные в каждом поле слегка изменяются в зависимости от типа результата. Я бы хотел поместить раздел from table1 -> join table3 в отдельное место, чтобы я мог вставить его несколько раз

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

Пример, который вы привели в своем вопросе, может быть преобразован в штраф CTE.

WITH CTE
     AS (SELECT a.field1,
                b.field2,
                c.field3,
                c.id AS c_id
         FROM   table1 a
                JOIN table2 b
                  ON a.id = b.table1_id
                JOIN table3 c
                  ON b.id = c.table2_id
         WHERE  cond1 = 'Pos Condition') 
SELECT field1,
       field2,
       field3
FROM   CTE
WHERE  cond2 = 'Test'
UNION
SELECT field1,
       field2,
       d.field3
FROM   CTE c
       JOIN table4 d
         ON c_id = d.table3_id
WHERE  cond2 = 'Second Type of Result' 
0 голосов
/ 28 декабря 2011

Вы смотрели на Общие табличные выражения (CTE)?

0 голосов
/ 28 декабря 2011
...