2015-04-30 91 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