ПОРЯДОК SQL Server/ГДЕ с вложенным выбором

Я пытаюсь заставить 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.

5
задан Echilon 2 April 2010 в 14:34
поделиться

2 ответа

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

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

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
7
ответ дан 13 December 2019 в 19:24
поделиться

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

4
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: