Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

动态生成视图sql

动态生成视图sql,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我有一个代码如下的视图 create view v1 as section1 --I get column1 data here union all section2 --I get column2 data here union all section3 --I get column3 data here 现在,此视图在多个位置使用,并将连接到第1列、第2列或第3列,具体取决于下面使用此视图的位置 select * from tabl1 t1 join v1 on t1.column1 =

我有一个代码如下的视图

create view v1
as
section1 --I get column1 data here
union all
section2 --I get column2 data here
union all
section3 --I get column3 data here
现在,此视图在多个位置使用,并将连接到第1列、第2列或第3列,具体取决于下面使用此视图的位置

select * from tabl1 t1 join v1 on t1.column1 = v1.column1
select * from tabl1 t2 join v1 on t2.column2 = v1.column2

但如果在第1列上连接,则不需要计算第2、3列,即第2、3节。根据当前的业务规则,我们无法将视图拆分为多个视图。现在,我需要的是,如果视图连接到第1列,则不应计算第2,3节,第2列,第1,3节和第3列,第1,2节的情况类似

有人能帮我怎么做到这一点吗

谢谢,
Sree

为了提示优化程序不需要在特定的联合子查询中生成任何行(以及不进行任何计算的行),您必须告诉它您实际上不需要这些信息。在某些情况下,不选择*(即不选择
v1.column2
v1.column3
)就足够了:

根据您的实际视图,可能存在优化者仍然无法证明不需要计算的边缘情况。在这些情况下,有一个明确区分每个子查询的常量列可能会有所帮助:

create view v1
as
select 'section1' AS discriminator
-- rest of section1
union all
select 'section2' AS discriminator
-- rest of section2
union all
select 'section3' AS discriminator
-- rest of section3
现在,在查询中也使用常量(而不是绑定变量)来选择鉴别器:

select t1.*, v1.column1 
from tabl1 t1 join v1 on t1.column1 = v1.column1 
where discriminator = 'section1'

select t1.*, v1.column2 
from tabl1 t2 join v1 on t2.column2 = v1.column2
where discriminator = 'section2'

当然,在这一点上,人们可能想知道您是否不应该创建3个不同的视图并直接从中进行选择,但我不知道您的要求…

您是否可以共享预期输出的结果集结构有时候SQL server optimizer可以自己忽略
union all
中不需要的部分。您看过查询计划吗?视图是(有时)复杂选择的简写。如果需要变量视图,可以定义不同的视图,每种情况一个视图,或者只需使用显式选择。如果您关心的是性能,那么这将是最有效的方法。
select t1.*, v1.column1 
from tabl1 t1 join v1 on t1.column1 = v1.column1 
where discriminator = 'section1'

select t1.*, v1.column2 
from tabl1 t2 join v1 on t2.column2 = v1.column2
where discriminator = 'section2'