2009-05-20 79 views
2

我有一个SP具有以下算法。SQL Server 2005 - 如果条件与联盟

IF <SomeCondition> 
BEGIN 
    SELECT * FROM TABLE1 
END 
ELSE 
BEGIN 
    SELECT * FROM TABLE2 
END 
--Union the above with the query below 
UNION 
    SELECT * FROM TABLE3 

返回的记录集完全相同。我需要做一个结果集的联合和另一个查询。

有没有办法做到这一点,而不必使用临时表?

+1

确保这三个表具有相同的结构。 – 2009-05-20 22:58:48

回答

8

如何:

SELECT * FROM TABLE1 WHERE <SomeCondition> 
UNION 
SELECT * FROM TABLE2 WHERE NOT <SomeCondition> 
UNION 
SELECT * FROM TABLE3 

如果你担心评估两次:

DECLARE @condition bit 
SET @condition = CASE WHEN <SomeCondition> THEN 1 ELSE 0 END 

SELECT * FROM TABLE1 WHERE @condition = 1 
UNION 
SELECT * FROM TABLE2 WHERE @condition = 0 
UNION 
SELECT * FROM TABLE3 
3

你也可以使用动态SQL,如果你不介意的话,它不是编译。例如:

DECLARE @sql VARCHAR(100) 
DECLARE @table VARCHAR(10) 

IF <SomeCondition> 
BEGIN 
    SET @table = 'Table1' 
END 
ELSE 
BEGIN 
    SET @table = 'Table2' 
END 

SET @sql = 'SELECT * FROM ' + @table + ' UNION SELECT * FROM TABLE3' 
EXEC(@sql) 
0

此外,如果你可以得到UNION ALL通过代替UNION的,这样做 - 可能会更便宜不消除重复