动态生成视图sql

时间:2017-01-02 10:49:51

标签: 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 = v1.column1
select * from tabl1 t2 join v1 on t2.column2 = v1.column2

但如果它加入了column1,则不需要计算column2,3,即2,3节。根据当前的业务规则,我们无法将视图拆分为多个视图。现在,我需要的是,如果视图在column1上加入,则不应计算section2,3,并且类似于column2,section1,3和column3,section1,2

有人可以帮助我如何实现这个目标

谢谢, SREE

1 个答案:

答案 0 :(得分:3)

为了暗示优化器不需要在特定的union子查询中生成任何行(以及那些不进行任何计算),你必须告诉它你实际上并不需要这些信息。在某些情况下,仅{not} SELECT *就足够了(即不选择v1.column2v1.column3):

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

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

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个不同的视图并直接从中进行选择,但我不了解您的要求......