Я пытаюсь заставить SQL Server заказывать столбцом от вложенного выбора. Я знаю, что это не лучший способ сделать это, но он должен быть сделан.
У меня есть две таблицы, Заказы и BookingItems. BookingItems содержит поля StartDate и EndDate, и на Заказе может быть несколько BookingItems. Я должен найти самый ранний startdate и последняя дата окончания от BookingItems, затем отфильтровать и вид этими значениями.
Я попробовал вложенным выбором, но когда я пытаюсь использовать один из выбранных столбцов в, ГДЕ или 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.
Это не должно быть проблемой. Можете ли вы опубликовать точный запрос, который завершился ошибкой?
Кроме того, группировка результатов будет проще и, вероятно, быстрее, чем выполнение вложенных запросов:
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
RE:
когда я пытаюсь использовать один из выбранных столбцов в WHERE или ORDER BY, я получаю {{1 }} "Неверное имя столбца".
Вам нужно будет использовать разные подходы для 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