2015-04-30 37 views
2

我在MS SQL Server的工作方法上的查詢選擇2014從數據的子集

,基本上是很多工會

select x, y 
where a = b 
union 
select x, y 
where a = b 
union 
select x, y 
where a = b 

它工作正常,但在where子句上的每個相同選擇。爲了便於維護,我想知道是否有更好,更乾淨的方法來做到這一點。

我想在某種程度上先用where子句選擇數據,然後只對這些數據進行所有其他查詢。

但即時通訊打開任何想法如何改善此查詢。

+2

在離題時,我想知道您是否真的想從聯合結果集中刪除重複項。如果沒有,請考慮使用'UNION ALL'來提高性能。 –

回答

4
;WITH Test AS 
(
    SELECT x, y 
    UNION 
    SELECT x, y 
    UNION 
    SELECT x, y 
) 
SELECT * FROM Test 
WHERE a = b 
+0

如果原始海報沒有之前沒有遇到過CTE,我認爲這裏值得指出的是,開始構造的奇怪分號是由於要求如果CTE不是批處理中的第一個語句,前面的語句必須以分號。所以,如果你習慣用分號來終止你的語句,這可能是一個好主意,那麼把它放在這樣一行的開頭是沒有必要的(http://stackoverflow.com/questions/710683/when-should -i-的用分號,在-SQL服務器)。 –

+0

@JoeFarrell好的一點提。完全同意 –

0
Select * 
From 
(
    select x, y 

    union 
    select x, y 

    union 
    select x, y 
) MyDerivedTable 
Where ... 

確保在派生表中的表的select語句中包含需要過濾的列。

+1

儘管更容易(不重複where子句),但您必須檢查解釋計劃,以查看where子句是否被推送到單個表格,以避免潛在的性能問題。 –

1

您可以使用子查詢並使用其外部的where子句以方便維護。 只要確保您在where子句中需要的子查詢中帶入所有列。例如

SELECT * FROM 
    (
     SELECT x,y,a,b FROM table1 
     union 
     SELECT x,y,a,b FROM table2 
     UNION 
     SELECT x,y,a,b FROM table3 
    )subquery 
    WHERE a=b