【问题标题】:Join works in query but not in view-script加入在查询中有效,但在视图脚本中无效
【发布时间】:2022-01-12 14:50:37
【问题描述】:

我有一个带有连接的查询,可以直接执行它(所以没有“创建视图”部分)。对于某些行,我从子查询 T3 中获得了平均持续时间。但是,当我使用完全相同的查询构建视图并从该视图中选择所有行时,连接不起作用。我在有值的地方得到 NULL 作为 averageDuration,直接执行查询。这怎么可能?

代码使用视图。每个以“V_”开头的表名实际上都是一个视图。 为了让这个脚本作为视图工作,我需要将子查询 T3 中与 V_Operationroom 的连接更改为普通表而不是视图。这个解决方案的奇怪之处在于表或视图 (V_)Operationroom 中使用的字段(Operationroom_Skey 和 IndOperationroom)在表和视图中具有相同的数据类型。视图实际上从表中获取它们 (SELECT Operationroom_Skey, IndOperationroom FROM Operationroom)。

CREATE VIEW [dbo].[V_WaitingList]
AS
    
SELECT  T1.Operationnumber, T3.AverageDuration

FROM V_Operation T1                                                                     
    
    LEFT JOIN V_Operationcode T2    ON  T1.Operationcode_Skey = T2.Operationcode_Skey                                                                       

    LEFT JOIN   (
                    SELECT  
                        S5.Operationcode,
                        AVG(S1.duration) AS AverageDuration
                    FROM V_F_Operatie S1
                        LEFT JOIN V_Operation S2 ON S1.Operation_SKey = S2.Operation_SKey
                        LEFT JOIN V_Operationroom S3 ON S1.Operationroom_Skey = S3.Operationroom_Skey
                        LEFT JOIN V_Operationcode S5 ON S2.Operationcode_Skey = S5.Operationcode_Skey   
                    WHERE   
                        S5.Operationcode IS NOT NULL AND
                        S3.IndOperationroom = '1'
                    GROUP BY    
                        S5.Operatieverrichtingcode

    )   T3  ON  T3.Operationcode = T2.Operationcode

GO

【问题讨论】:

    标签: sql join view


    【解决方案1】:

    尝试使用 CTE 而不是像下面这样的普通子查询;

    CREATE VIEW [dbo].[V_WaitingList] AS
    WITH CTEView AS (
         SELECT S5.Operationcode,
                AVG(S1.duration) AS AverageDuration
                FROM V_F_Operatie S1
                LEFT JOIN V_Operation S2 ON S1.Operation_SKey = S2.Operation_SKey
                LEFT JOIN V_Operationroom S3 ON S1.Operationroom_Skey = S3.Operationroom_Skey
                LEFT JOIN V_Operationcode S5 ON S2.Operationcode_Skey = S5.Operationcode_Skey   
                WHERE S5.Operationcode IS NOT NULL AND S3.IndOperationroom = '1'
                GROUP BY S5.Operatieverrichtingcode
    )
    SELECT  T1.Operationnumber, T3.AverageDuration
    FROM V_Operation T1                                                                     
    LEFT JOIN V_Operationcode T2 ON T1.Operationcode_Skey = T2.Operationcode_Skey                                                                       
    LEFT JOIN CTEView T3 ON T3.Operationcode = T2.Operationcode
    

    【讨论】:

    • Okechukwu Ossai,谢谢您的回复!我们实际上已经有了一个解决方案,就像我提到的那样,但是我们不明白为什么我们有不同的行为直接执行查询或执行视图。你知道为什么执行查询会产生一个有效的连接,而执行视图,下面的相同查询会产生一个不起作用的连接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多