Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用案例从sql server中的不同表中获取值_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 使用案例从sql server中的不同表中获取值

Sql server 使用案例从sql server中的不同表中获取值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我需要基于不使用动态sql的条件的结果 比如@param1=10 然后我需要表1中所有行的详细信息 否则我需要表2中的详细信息 我试过下面这样的方法,但没有结果 declare @param1 int=10; select * from case when @param1=10 then table1 else table2 end 注:我知道如果条件如下,我可以使用 if @param1=10 select * from table1 else select * from table

我需要基于不使用动态sql的条件的结果

比如@param1=10 然后我需要表1中所有行的详细信息

否则我需要表2中的详细信息

我试过下面这样的方法,但没有结果

declare @param1 int=10;
select * from 

case when @param1=10 then table1

else table2 end
注:我知道如果条件如下,我可以使用

if @param1=10 
select * from table1
else
select * from table2
但在我的例子中,查询非常长,所以我不想再次替换所有查询

因此,我希望我可以在不再次替换所有查询的情况下对case做一些事情


请帮助我解决此问题

避免动态SQL的一个选项是联合:


如果两个表都有要连接的唯一id,则可以使用

SELECT CASE WHEN @param1 = 10 then t1.C1
ELSE t2.C1
END as C
FROM table1 t1
INNER JOIN table2 t2 on 
t1.Id = t2.Id
尝试此操作,但需要检查查询的性能

Declare @t1 Table(id int , Name nvarchar(MAX))
Declare @t2 Table(id int , Name nvarchar(MAX))
Declare @t int = 10

insert into @t1 values (1,'Jhon')
insert into @t1 values (2, 'Jhon2')

insert into @t2 values (3, 'Rahul')
insert into @t2 values (4, 'Rahul2')

Select distinct Case when @t = 10 then t1.Name else t2.Name end as Name
from @t1 t1 cross join @t2 t2 
另一种方法

with CTE_t1 as (Select * from table1 where @param1 = 10), 
    CTE_t2 as (Select * from table2 where @param1 != 10),
    CTE_t3 as (Select * from CTE_t1 union all Select * from CTE_t2)

    Select * -- you can use your 200 line of code here only once
    from CTE_t3
可以将UNION ALL作为子查询放置,然后围绕该子查询构建查询的其余部分:

SELECT
    * --TODO - Columns
FROM
    (SELECT * FROM tableA WHERE @Param=10
     UNION ALL
     SELECT * FROM TableB WHERE @Param<>10) t
WHERE /* other conditions here */

另一方面,如果您有两个表,其中包含相同类型的行,因此您希望在查询中交换它们,这可能表明您的数据模型已被破坏—本应建模为属性的内容已嵌入到表名中。例如,与其使用FemaleEmployees表和MaleEmployees表,不如使用一个带有性别列的Employees表。

您可以使用动态SQL。@Wewesthemenance感谢您的快速重播。除了动态sql,还有其他方法吗?有,但这可能会导致性能问题。这两个表是否具有相同的列定义?因为如果不是,没有动态SQL,这是行不通的。@Damien_The__是的,两个表都有相同的列定义。如果表1和表2有相同的列,这将起作用。明智的做法是声明要检索的列,而不是使用asterix*是的,我同意你的观点,但它还需要再次重复代码。我试图避免重复代码Table1和table2具有相同的列定义,但这些表之间没有公共数据。在某些情况下,数据将在表1中,而在另一种情况下,数据将在表2中。我认为CTE最适合您的场景。这是一个单行语句,但在我的情况下,select语句本身包含200多行,所以我可以再次重复select条件吗?@ArunprasanthKV-我不明白-您可以接受我提出的查询在我的回答中提供,只需编辑带有注释的两个区域,您就不会重复任何内容。不幸的是,我有一个很长的问题。我的意思是从条件所在的表中选择长序列。所以我需要重复select两次???@ArunprasanthKV-不,你可以把长序列放在我标记的-TODO-列的位置,然后在子查询中保留select*。是的,现在我知道了…谢谢你的回答..但是性能呢??
SELECT
    * --TODO - Columns
FROM
    (SELECT * FROM tableA WHERE @Param=10
     UNION ALL
     SELECT * FROM TableB WHERE @Param<>10) t
WHERE /* other conditions here */