2010-04-02 68 views
5

我试图让SQL Server按照嵌套选择列进行排序。我知道这不是这样做的最好方式,但需要完成。SQL Server ORDER BY/WHERE嵌套选择

我有两张表,Bookings和BookingItems。 BookingItems包含StartDate和EndDate字段,预订中可以有多个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的

回答

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 
+0

完美的作品,谢谢。 – Echilon 2010-04-02 17:29:21

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 

在您发布查询你需要做这样的事情,以避免错误的情况。我花了零时间观察语义,看看是否有更好的方法!

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