SQL Server ORDER BY / WHERE с вложенным выбором - PullRequest
5 голосов
/ 02 апреля 2010

Я пытаюсь упорядочить SQL Server по столбцу из вложенного выбора. Я знаю, что это не лучший способ сделать это, но это нужно сделать.

У меня есть две таблицы: Бронирования и Элементы бронирования. 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.

Ответы [ 2 ]

7 голосов
/ 02 апреля 2010

Это не должно быть проблемой. Можете ли вы опубликовать точный запрос, который не удается?

Кроме того, группировка результатов будет проще и, вероятно, быстрее, чем выполнение вложенных запросов:

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
4 голосов
/ 02 апреля 2010

RE:

когда я пытаюсь использовать один из выбранных столбцы в ГДЕ или ЗАКАЗАТЬ ПО, я получаю «Неверное имя столбца».

Вам нужно будет использовать разные подходы для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...