2010-04-02 19 views
5

Estoy intentando hacer que SQL Server ordene por una columna desde una selección anidada. Sé que esta no es la mejor manera de hacerlo, pero es necesario hacerlo.SQL Server ORDER BY/WHERE con la selección anidada

Tengo dos mesas, reservas y artículos de reserva. BookingItems contiene los campos StartDate y EndDate, y puede haber varios BookingItems en una reserva. Necesito encontrar la fecha de inicio más antigua y la última fecha de finalización de BookingItems, luego filtrar y ordenar por estos valores.

Lo he intentado con una selección anidada, pero cuando trato de usar una de las columnas seleccionadas en un WHERE o ORDER BY, obtengo un "Nombre de columna no válido".

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' 

¿Falta algo sobre SQL ordering? Estoy usando SQL Server 2008.

Respuesta

7

Eso no debería ser un problema. ¿Puedes publicar la consulta exacta que está fallando?

Además, la agrupación de los resultados será más fácil y probablemente más rápido a continuación, ejecutar las consultas anidadas:

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

funciona perfectamente, gracias. – Echilon

4

RE:

cuando trato de utilizar uno de los columnas seleccionadas en un WHERE o ORDER BY, consigo un "Nombre de columna no válido".

Deberá usar diferentes enfoques para ORDER BY y WHERE. ¿Puedes publicar el código exacto que estabas intentando?

El siguiente es el orden (general) de evaluación. Los alias de columna sólo están disponibles a partir del paso 5 en adelante por lo que están disponibles en el ORDER BY pero no donde

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

En el caso de la consulta publicado que tendría que hacer algo como esto para evitar el error. ¡He pasado cero tiempo mirando la semántica para ver si hay una mejor manera!

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' 

Este hilo explica las cosas con mucho más detalle http://dbaspot.com/forums/sqlserver-programming/392124-when-can-we-use-column-alias-where-group-having-order.html#8

Cuestiones relacionadas