2016-06-02 2 views
1

У меня есть таблица с колонками [From], [To]. Мне нужно, чтобы выбрать эти столбцы в виде единого списка, и я делаю это так:SQL Выберите 2 столбца как список из одной строки

SELECT [From] FROM [TableX] WHERE (...) 
UNION 
SELECT [To] FROM [TableX] WHERE (...) 

Проблема заключается в том, что я не хочу, чтобы дублировать WHERE (...) состояние, как это довольно долго. Есть ли способ избежать этого дублирования?

+0

если из той же таблицы и 'WHERE' абсолютно такие же, почему вам нужно' UNION'? – Alex

+1

Покажите нам предложение WHERE, и это будет легче понять проблему. – jarlh

ответ

3

Используйте КТР для предотвращения дублирования вашего WHERE условия:

;WITH [CTE_Criteria] AS (
    SELECT [From], [To] 
    FROM [TableX] 
    WHERE (...) 
) 
SELECT [From] FROM [CTE_Criteria] 
UNION 
SELECT [To] FROM [CTE_Criteria]; 
+0

не уверен, что это действительно решит проблему. – Alex

+0

Я понял, что проблема заключается в том, что он должен был включить одно и то же условие WHERE дважды. В запросе выше он только один раз. –

+0

Можете ли вы предоставить пример с этим примером, пожалуйста? с некоторым простым 'where'. Я никогда раньше не использовал эту технику. – Alex

1

Сделайте UNION в производной таблице и получите одно общее предложение WHERE.

select * 
from 
(
    SELECT [From] FROM [TableX] 
    UNION 
    SELECT [To] FROM [TableX] 
) 
WHERE (...) 
+0

это никогда не сработает ;-) подзапрос содержит только 1 столбец, но не все, что у вас есть в таблице, и в разделе 'WHERE' :-) – Alex

+0

Зависит от предложения WHERE ... Вы можете делать двухуровневые производные таблицы, если это необходимо , – jarlh

+0

нет нет * зависит *. Укажите, пожалуйста, какой-нибудь разумный пример, когда этот запрос принесет тот же результат, что и исходный? 'WHERE 1 = 1'? – Alex