2017-03-24 25 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