2010-04-02 4 views
5

Próbuję uzyskać SQL Server do uporządkowania według kolumny z zagnieżdżonego zaznaczenia. Wiem, że nie jest to najlepszy sposób, ale trzeba to zrobić.Serwer SQL ORDER BY/WHERE z zagnieżdżonym zaznaczeniem

Mam dwie tabele, Rezerwacje i BookingItems. BookingItems zawiera pola StartDate i EndDate, i może być wiele BookingItems w Rezerwacji. Muszę znaleźć najwcześniejszą datę rozpoczęcia i datę zakończenia od BookingItems, a następnie filtrować i sortować według tych wartości.

Próbowałem już z zagnieżdżonym zaznaczeniem, ale gdy spróbuję użyć jednej z wybranych kolumn w GDZIE lub ZAMÓW, otrzymuję "Nieprawidłowa nazwa kolumny".

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' 

Czy brakuje mi czegoś o zamawianiu kodu SQL? Używam SQL Server 2008.

Odpowiedz

7

to nie powinno być problemem. Czy możesz opublikować dokładne zapytanie, które się nie udaje?

Ponadto, grupowanie wyników będzie łatwiejsze i prawdopodobnie szybciej niż działa zagnieżdżone zapytania:

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

Działa doskonale, dzięki. – Echilon

4

RE:

gdy próbuję użyć jednego z wybranych kolumn w WHERE lub ORDER BY, mam „Nieprawidłowy Nazwa kolumny”.

Będziesz musiał zastosować różne podejścia do ZAMÓWIENIA i GDZIE. Czy możesz podać dokładny kod, który próbujesz?

Poniżej znajduje się (ogólna) kolejność oceny. Aliasy kolumn są dostępne tylko od kroku 5 roku więc są użyteczne w kolejności, ale nie tam, gdzie

(5) SELECT (6) DISTINCT 
(1) FROM 
(2) WHERE 
(3) GROUP BY 
(4) HAVING 
(7) ORDER BY 

W przypadku twojej pisał Query trzeba by zrobić mu coś takiego, aby uniknąć błędu. Spędziłem czas zerowy patrząc na semantykę, aby zobaczyć, czy istnieje lepszy sposób!

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' 

Ten wątek wyjaśnia rzeczy bardziej szczegółowo http://dbaspot.com/forums/sqlserver-programming/392124-when-can-we-use-column-alias-where-group-having-order.html#8