【问题标题】:T-sql Subquery within Subquery子查询中的 T-sql 子查询
【发布时间】:2015-10-26 11:09:03
【问题描述】:

我对 SQL Server 还很陌生,并且正在学习,如果答案很明显,或者我只是以完全错误的方式处理这个问题,我很抱歉。

我正在将一个查询从访问转移到 SQL 服务器,相关查询在子查询中有子查询。

WITH CalculateSPBalance AS
( SELECT [BOOKINGS FILE].[Booking Number], ([Promoter Codes].[Promoter's Price] + [Promoter Codes].[Resform Deposit] * [Promoter Codes].[Resform Deposit deducted from sp] -
        [Venue Codes].[Event Price]) - [Venue Codes].[Event Deposit] * [BOOKINGS FILE].[Charity paid event deposit] AS [SP Balance]
   FROM [BOOKINGS FILE]
   INNER JOIN [Promoter Codes] ON [BOOKINGS FILE].[Promoter Code] = [Promoter Codes].[Promoter Code]
   INNER JOIN [Venue Codes]    ON [BOOKINGS FILE].[Venue Code] = [Venue Codes].[Venue Code]

)
, CalculateSPBeingHeld AS
( SELECT [BOOKINGS FILE].[Booking Number], SUM([Sponsorship Collected].Amount) AS [SP held]
   FROM [BOOKINGS FILE]
   LEFT OUTER JOIN [Sponsorship Collected] ON [BOOKINGS FILE].[Booking Number] = [Sponsorship Collected].[Booking Number]
   WHERE ([Sponsorship Collected].[Received by] = N'holding')
   GROUP BY [BOOKINGS FILE].[Booking Number]
)
SELECT [BOOKINGS FILE].[Booking Number],
CASE
    WHEN CalculateSPBeingHeld.[SP held] IS NULL
    THEN 0
    ELSE CalculateSPBeingHeld.[sp held] - CalculateSPBalance.[SP Balance]
END AS test
FROM [Bookings file]

INNER JOIN CalculateSPBalance   ON[BOOKINGS FILE].[Booking Number] = CalculateSPBalance.[Booking Number]
INNER JOIN CalculateSPBeingHeld ON[BOOKINGS FILE].[Booking Number] = CalculateSPBeingHeld.[Booking Number]

ORDER BY [booking number]

据我了解,这两个子是在整个查询中定义和使用的。

这很好用。

然后我将如何将这些结果用作更大查询的一部分

WITH test2 AS
    (
        CalculateSPBalance AS
        ( SELECT [BOOKINGS FILE].[Booking Number], ([Promoter Codes].[Promoter's Price] + [Promoter Codes].[Resform Deposit] * [Promoter Codes].[Resform Deposit deducted from sp] -
                [Venue Codes].[Event Price]) - [Venue Codes].[Event Deposit] * [BOOKINGS FILE].[Charity paid event deposit] AS [SP Balance]
           FROM [BOOKINGS FILE]
           INNER JOIN [Promoter Codes] ON [BOOKINGS FILE].[Promoter Code] = [Promoter Codes].[Promoter Code]
           INNER JOIN [Venue Codes]    ON [BOOKINGS FILE].[Venue Code] = [Venue Codes].[Venue Code] )
        , CalculateSPBeingHeld AS
        ( SELECT [BOOKINGS FILE].[Booking Number]                                              , SUM([Sponsorship Collected].Amount) AS [SP held]
           FROM [BOOKINGS FILE]
           LEFT OUTER JOIN [Sponsorship Collected] ON [BOOKINGS FILE].[Booking Number] = [Sponsorship Collected].[Booking Number]
           WHERE ([Sponsorship Collected].[Received by] = N'holding')
           GROUP BY [BOOKINGS FILE].[Booking Number] 
        )


        SELECT [BOOKINGS FILE].[Booking Number],
                CASE
                    WHEN CalculateSPBeingHeld.[SP held] IS NULL
                    THEN 0
                    ELSE CalculateSPBeingHeld.[sp held] - CalculateSPBalance.[SP Balance]
                END AS test
        FROM [Bookings file]

        INNER JOIN CalculateSPBalance   ON[BOOKINGS FILE].[Booking Number] = CalculateSPBalance.[Booking Number]
        INNER JOIN CalculateSPBeingHeld ON[BOOKINGS FILE].[Booking Number] = CalculateSPBeingHeld.[Booking Number]

        ORDER BY [booking number]
    )

SELECT *
FROM test2

所以我想使用这个由子查询组成的数据集作为更大查询中的子查询

多谢了

【问题讨论】:

  • 问题是什么?并处理格式。

标签: sql-server tsql subquery


【解决方案1】:

你可以让test2另一个CTE

WITH  CalculateSPBalance AS
        ( 
                SELECT [BOOKINGS FILE].[Booking Number], ([Promoter Codes].[Promoter's Price] + [Promoter Codes].[Resform Deposit] * [Promoter Codes].[Resform Deposit deducted from sp] -
                [Venue Codes].[Event Price]) - [Venue Codes].[Event Deposit] * [BOOKINGS FILE].[Charity paid event deposit] AS [SP Balance]
                FROM [BOOKINGS FILE]
                INNER JOIN [Promoter Codes] ON [BOOKINGS FILE].[Promoter Code] = [Promoter Codes].[Promoter Code]
                INNER JOIN [Venue Codes]    ON [BOOKINGS FILE].[Venue Code] = [Venue Codes].[Venue Code] )
        , CalculateSPBeingHeld AS
        ( 
                SELECT [BOOKINGS FILE].[Booking Number]                                              , SUM([Sponsorship Collected].Amount) AS [SP held]
                FROM [BOOKINGS FILE]
                LEFT OUTER JOIN [Sponsorship Collected] ON [BOOKINGS FILE].[Booking Number] = [Sponsorship Collected].[Booking Number]
                WHERE ([Sponsorship Collected].[Received by] = N'holding')
                GROUP BY [BOOKINGS FILE].[Booking Number] 
        )
        , test2 as (


                SELECT [BOOKINGS FILE].[Booking Number],
                        CASE
                            WHEN CalculateSPBeingHeld.[SP held] IS NULL
                            THEN 0
                            ELSE CalculateSPBeingHeld.[sp held] - CalculateSPBalance.[SP Balance]
                        END AS test
                FROM [Bookings file]

                INNER JOIN CalculateSPBalance   ON[BOOKINGS FILE].[Booking Number] = CalculateSPBalance.[Booking Number]
                INNER JOIN CalculateSPBeingHeld ON[BOOKINGS FILE].[Booking Number] = CalculateSPBeingHeld.[Booking Number]

    )

SELECT *
FROM test2                 
ORDER BY [booking number]

请注意,不支持在 CTE 内排序(少数例外),因此排序是在 CTE 定义之外完成的。

【讨论】: