2010-04-02 5 views
5

중첩 된 선택에서 열을 기준으로 SQL Server를 주문하려고합니다. 나는 이것이 최선의 방법이 아니라는 것을 안다.SQL Server ORDER BY/WHERE 내포 된 선택 사용

두 개의 테이블, 예약 및 예약 항목이 있습니다. BookingItem에는 StartDate 및 EndDate 필드가 있으며 예약에는 여러 개의 BookingItem이있을 수 있습니다. 가장 빠른 시작 날짜와 가장 최근의 종료 날짜를 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 서버를 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

4

RE를 사용하고 있습니다 :

은 내가 WHERE 또는 ORDER BY에서 선택한 열 중 하나를 사용하려고하면, 나는 "잘못된 열 이름"얻는다.

ORDER BY 및 WHERE에 대해 다른 접근 방식을 사용해야합니다. 당신이 시도한 정확한 코드를 게시 할 수 있습니까?

아래는 (일반적인) 평가 순서입니다. 열 별칭 이후 이렇게 순서대로 사용할 수 있지만 5 단계에서 구할 수 있습니다하지 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