可以选择在T-SQL中使用另一个表中的UNION而不使用临时表或动态sql?

时间:2009-08-11 18:28:50

标签: sql sql-server tsql

我有两个具有相同结构的sql server表。在存储过程中,我从第一个表中选择了一个。偶尔我想根据传入的参数从第二个表中进行选择。

我想要一种方法来做到这一点,而无需使用动态SQL或临时表。

5 个答案:

答案 0 :(得分:6)

将param = 1传递给union,其他任何东西只返回第一个结果集:

select field1, field2, ... from table1 where cond
union
select field1, field2, ... from table2 where cond AND param = 1

答案 1 :(得分:2)

如果它们都是完全相同的结构,那么为什么没有一个带有参数的表来区分这两个表呢?那时,对于您收到的结果集的参数的案例陈述就变得简单了。

第二种选择是双重结果集。您可以从存储过程中选择多个结果集。然后在代码中,您将使用DataReader.NextResult或DataSet.Tables(1)来获取第二组数据。然后,您的代码有责任将它们放入同一个集合中或合并两个表。

第三种可能性是使用IF声明。比如说,传入一个带有1,2,3预期可能值的整数,然后在实际的存储过程代码中有这样的东西

if @Param = 1 Then 
    Select From Table1
if @Param = 2 THEN 
    Select From Table2
if @Param = 3 Then
   Select From Table1 Union Select From Table 2

第四种可能性是有两个不同的程序,一个运行一个联合,另一个运行联合,然后让你的代码负责根据该参数确定调用哪一个,如:

myCommandObject.CommandText = IIf(myParamVariable = true, "StoredProc1", StoredProc2")

答案 2 :(得分:1)

这很容易。

/* Always return tableX */
select colA, colB
from tableX
union
select colA, colB
from tableY
where @parameter = 'IncludeTableY'  /* Will union with an empty set otherwise */

如果没有立即显现(通常不是),请考虑以下示例。要记住的主要事情是,如果一个行的where子句求值为true,则返回它,否则它将被丢弃。

这总是计算为true,因此返回每一行。

select * 
from tableX
where 1 = 1

这总是计算为false,因此不返回任何行(有时用作快速和脏的get-me-the-columns查询)。

select * 
from tableX
where 1 = 0

答案 3 :(得分:0)

这将返回任一表中的值,具体取决于您是否在参数

上传递了值
select field1, field2, ... from table1 where @p1 is null
union
select field1, field2, ... from table2 where @p1 is not null

您只需要为where子句

添加其余条件

答案 4 :(得分:0)

使用视图。

创建view_both 如 SELECT *,1 AS源   FROM table1 UNION ALL SELECT *,2 AS源   FROM table2

SELECT * FROM view_both WHERE source< @source_flag

优化器根据源确定要使用哪个或哪两个表,而不要求对其进行索引。