【问题标题】:Generate view sql dynamically动态生成视图sql
【发布时间】:2017-01-02 10:49:50
【问题描述】:

我有如下代码视图

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

现在,这个视图在多个地方使用,并且将在 column1 或 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 的情况类似

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

谢谢, 斯里

【问题讨论】:

  • 能分享一下预期输出的结果集结构吗
  • 有时 SQL Server 优化器可以自己忽略 union all 中不需要的部分。你看过查询计划吗?
  • A View 是(有时)复杂的 SELECT 的简写。如果您需要一个变量视图,请定义不同的视图,每种情况一个或简单地使用显式 SELECT(s)。如果您关心的是性能,这将是最有效的方法。

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

为了提示优化器它不需要在特定联合子查询中生成任何行(以及那些不进行任何计算的行),您必须告诉它您实际上并不需要该信息。在某些情况下,不选择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 个不同的视图并直接从中选择,但我不知道您的要求...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2013-08-30
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多