【问题标题】:SQL Server ORDER BY/WHERE with nested selectSQL Server ORDER BY/WHERE 与嵌套选择
【发布时间】:2010-04-02 23:15:22
【问题描述】:

我正在尝试让 SQL Server 按嵌套选择中的列排序。我知道这不是最好的方法,但必须这样做。

我有两个表,Bookings 和 BookingItems。 BookingItems 包含 StartDate 和 EndDate 字段,一个 Booking 上可以有多个 BookingItems。我需要从 BookingItems 中找到最早的开始日期和最晚的结束日期,然后按这些值进行过滤和排序。

我尝试过使用嵌套选择,但是当我尝试使用 WHERE 或 ORDER BY 中的选定列之一时,我得到一个“无效的列名”。

SELECT b.*, (SELECT COUNT(*) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS TotalRooms,
        (SELECT MIN(i.StartDate) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS StartDate, 
        (SELECT MAX(i.EndDate) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS EndDate 
FROM bookings b LEFT JOIN customers c ON b.CustomerID = c.CustomerID  WHERE StartDate >= '2010-01-01'

我是否遗漏了一些关于 SQL 排序的内容?我正在使用 SQL Server 2008。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    这应该不是问题。你能发布失败的确切查询吗?

    此外,与运行嵌套查询相比,对结果进行分组会更容易并且可能更快:

    SELECT 
      TotalRooms = COUNT(*)
    , StartDate = MIN(i.StartDate)
    , EndDate =  MAX(i.EndDate)
    FROM bookings b 
    LEFT JOIN bookingitems bi 
      ON b.BookingID = bi.BookingID
    GROUP BY b.BookingID
    WHERE MIN(i.StartDate) >= '2010-01-01'
    ORDER BY StartDate, EndDate
    

    【讨论】:

      【解决方案2】:

      回复:

      当我尝试使用其中一个选定的 WHERE 或 ORDER BY 中的列,我得到 一个“无效的列名”。

      您需要对 ORDER BY 和 WHERE 使用不同的方法。你能发布你正在尝试的确切代码吗?

      以下是(一般)评估顺序。列别名仅从第 5 步开始可用,因此可用于 ORDER BY 但不能用于 WHERE

      (5) SELECT (6) DISTINCT
      (1) FROM
      (2) WHERE
      (3) GROUP BY
      (4) HAVING
      (7) ORDER BY
      

      对于您发布的查询,您需要这样做以避免错误。我花了零时间查看语义,看看是否有更好的方法!

      SELECT b.*, (SELECT COUNT(*) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS TotalRooms,
              (SELECT MIN(i.StartDate) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS StartDate, 
              (SELECT MAX(i.EndDate) FROM bookingitems i WHERE b.BookingID = i.BookingID) AS EndDate 
      FROM bookings b LEFT JOIN customers c ON b.CustomerID = c.CustomerID  
      WHERE (SELECT MIN(i.StartDate) FROM bookingitems i WHERE b.BookingID = i.BookingID) >= '2010-01-01'
      

      这个帖子更详细地解释了事情http://dbaspot.com/forums/sqlserver-programming/392124-when-can-we-use-column-alias-where-group-having-order.html#8

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多