【问题标题】:How does SQL Server break down view code and pick the right tables to extract?SQL Server 如何分解视图代码并选择要提取的正确表?
【发布时间】:2019-12-10 21:28:02
【问题描述】:

我在 SQL Server 2017 中遇到了关于视图的问题。

我正在对后面有多个基础表的视图运行查询。除了SELECT子句中涉及的表之外,其他表也被SQL Server逻辑读取,我想知道为什么。

这里是场景:

/*******************************************************/
CREATE VIEW v_test
AS
SELECT 
    a.col1,
    a.col2,
    b.col3,
    b.col4,
    c.col5,
    c.col6,
    d.col7,
    d.col8,
    e.col9,
    e.col10,
    f.col11,
    f.col12,
    g.col13,
    g.col14
FROM  a
LEFT JOIN b
LEFT JOIN c
LEFT JOIN d
LEFT JOIN e
LEFT JOIN f
LEFT JOIN g

/*********************************************************/
SELECT col1, col2
FROM V_test
  • col1 col2 只能从 tbl_a 中取出。=>意思是,逻辑读取应该只读取表 a。
  • 但是,逻辑读取结果是读取的表比 tbl_a 多。在我得到的一个场景中,它读取 tbl_a 到 tbl_g。

这是为什么?

【问题讨论】:

  • 当然它会读取其他表。它需要根据连接谓词知道是否有任何行被删除或重复。

标签: sql-server join view


【解决方案1】:

根据所有连接条件,表 A 中的行可能会被消除或重复。
因此,在大多数情况下,要知道应该返回多少行,所有连接条件都必须进行评估。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多