2017-03-24 23 views
2

我有几个针对UNION子句统一的查询 我想过滤一个字段的总结果。 一个想法是过滤每个查询,但它可能是“硬”无功。在UNION中创建一个“final”过滤器SQL

SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 

--WHERE LicenseCode > 7878 

很明显,最后的声明不起作用。 如何过滤总的UNION结果? (不把言(WHERE LicenseCode > 7878)在每个查询

感谢 问候

回答

3

使工会子查询,然后筛选结果:!

select group, LicenseCode, Field2, Field3, Field4 
from (
    SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
    UNION 
    SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
    UNION 
    SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
) x 
WHERE LicenseCode > 7878 
+0

您可能需要SQL Server中派生表的别名。 –

+0

@ThorstenKettner可能......因此加入以防万一。 – Richard

+0

谢谢!它工作正常! –

6

首先,不要使用UNION ,使用UNION ALLUNION会导致额外的开销删除重复

其次,您的问题的答案是使用子查询或CTE:

SELECT t.* 
FROM ((SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
     FROM TABLE 
    ) UNION ALL 
     (SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
     FROM TABLE 
    ) UNION ALL 
     (SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
     FROM TABLE 
    ) 
    ) t 
WHERE LicenseCode > 7878; 

SQL Server有一个智能优化器。我很确定它将WHERE子句向下推送到各个子查询。这是一个重要的优化。在不这样做的数据库中,您可能需要重复WHERE条件。

注:如果您是从同一个表中选择再有就是编写查询一个更好的办法:

select grp, t.licensecode, t.field2, t.field3, t.field4 
from table t cross apply 
    (values ('group1'), ('group2'), ('group3')) g(grp) 
where licensecode > 7878; 
+0

我不确定。但是,如果您正在使用不同的“组”(GROUP1,GROUP2,GROUP3),则UNION或UNION ALL将显示相同的结果。 我记得我在这件事上想了很多。我得出了这个结论! 感谢您的帮助 –

+0

对不起,我正在阅读。 即使结果相同,“联盟”总是比“联盟所有”更多时间? –

+1

@jorge_vicente。 。 。我很确定没有数据库优化'UNION'来消除重复的消除。因此,它会变慢。这就是为什么你应该使用'UNION ALL'。 –

0

如果你只想再以任何顺序对结果进行排序,所有你需要做的是只需在联合会最后选择的声明中下一个命令即可。它会默认为你排序整个结果。所以它应该看起来像这样

SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
ORDER BY YourColumnName 

但是既然你在这里也想过滤基于列的记录。请尝试此操作

;WITH CTE 
AS 
(
    SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
    UNION 
    SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
    UNION 
    SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
    FROM TABLE 
) 
SELECT 
    * 
    FROM CTE 
     WHERE LicenseCode > 7878 
      ORDER BY Your Columnname 
0

利用CTE。

; WITH CTE AS 
(
SELECT 'GROUP1' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP2' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
UNION 
SELECT 'GROUP3' AS GROUP, LicenseCode, Field2, Field3, Field4 
FROM TABLE 
) 
select * from CTE WHERE LicenseCode > 7878