生成视图SQL动态

问题描述:

我有代码的图如下生成视图SQL动态

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,对于column2,3即计算的加盟,则不需要第2,3。根据当前的业务规则,我们不能将视图分成多个视图。现在,我需要的是,如果视图被加入到column1,section2,3不应该被计算出来,类似的情况与column2,section1,3和column3,section1,2

有人可以请帮助我如何实现这一点

感谢, SREE

+0

可以共享的结果集预期输出的结构 – balaji

+0

有时SQL服务器会优化izer可以忽略'union all'的不需要的部分。你看过查询计划吗? – Arvo

+0

A **查看**是一个(有时)复杂** SELECT **的简写。如果你需要一个变量视图,可以定义不同的视图,每个视图一个,或者简单地使用显式的SELECT(s)。如果你关心的是性能,这将是最有效的方法。 – FDavidov

为了暗示,它并不需要产生任何行(以及那些没有做任何计算)在一个特定的工会子查询优化器,你必须告诉它你不实际上需要信息。在某些情况下,这将是足够的,只是不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点不同的意见,并从中直接选择,但我不知道你的要求......