嵌套选择的SQL Server ORDER BY / WHERE

时间:2010-04-02 14:34:10

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

我正在尝试通过嵌套选择中的列来使SQL Server排序。我知道这不是最好的方法,但需要这样做。

我有两个表,Bookings和BookingItems。 BookingItems包含StartDate和EndDate字段,并且预订中可以有多个BookingItems。我需要从BookingItems找到最早的startdate和最新结束日期,然后按这些值进行过滤和排序。

我尝试使用嵌套选择,但是当我尝试在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。

2 个答案:

答案 0 :(得分:7)

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

此外,对结果进行分组将比运行嵌套查询更容易,也更快:

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

答案 1 :(得分:4)

RE

  

当我尝试使用其中一个选中的   我得到的是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

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

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