我还能如何更有效地编写此嵌套查询?

问题描述

是否有更高效的编写此嵌套查询方法查询已大大简化,但基本上字段需要从基表一直构建到所需结果)。

@YearofBookingminus1 是一个声明和计算的变量。这是通过的,对于手头的问题不一定是必需的。我没有添加这个代码

SELECT fct.ContractNo,Paced_revenue = CASE
                            WHEN fct.ContractStatus = 'Booked'
                             AND CYpacing = 'Y' THEN 1
                            ELSE 0 END
  FROM (   SELECT base_fct.ContractNo,CASE
                       WHEN base_fct.YearofBooking <= @YearofBookingminus1 THEN 'Y'
                       ELSE 'N' END AS CYpacing
             FROM (   SELECT A.DIM_CONTRACT_ID,B.YearofBooking
                        FROM SchemaA.Contract A
                        JOIN SchemaB.dim_date B
                          ON SchemaB.ID BETWEEN SchemaA.StartDate AND SchemaA.EndDate) AS base_fct ) AS fct;

解决方法

这看起来像一个简单的 with 语句

With base_fct as
(
  SELECT A.DIM_CONTRACT_ID,B.YearofBooking
  FROM SchemaA.Contract A
  JOIN SchemaB.dim_date B
  ON B.ID BETWEEN A.StartDate AND A.EndDate
),fct as 
(
    SELECT ContractNo,CASE WHEN YearofBooking <= @YearofBookingminus1 THEN 'Y'
    ELSE 'N' END AS CYpacing
    FROM base_fct
)
select ContractNo,CASE WHEN ContractStatus = 'Booked' AND CYpacing = 'Y' THEN 1 ELSE 0 END as Paced_revenue
from fct

根据语法,您可能使用的是 postgresql 或 mssql,所以这应该可以工作,但您应该更新以使问题更清楚