动态生成视图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'