tengo una opinión de que es algo así comoSQL Server - USE existe cláusula en Dónde y Seleccionar
CREATE VIEW OrdersView WITH SCHEMABINDING AS
SELECT o.Id, o.OrderDate, o.LastName, o.TotalPrice, s.Status
FROM dbo.Orders o INNER JOIN dbo.OrderStatus s on o.Id = s.OrderId
WHERE NOT EXISTS (SELECT NULL from dbo.OrderStatus where OrderId = s.OrderId and StatusDate > s.StatusDate
AND EXISTS (SELECT NULL FROM dbo.OrderLineItemType1 WHERE OrderId = o.Id)
La intención es traer todas las órdenes que tienen al menos una línea de tipo 1, junto con su estado actual.
Estamos en el proceso de añadir un segundo tipo de elemento de línea, y he modificado el punto de vista que va a incluir órdenes que tienen al menos una línea de tipo 1 o tipo 2:
CREATE VIEW OrdersView WITH SCHEMABINDING AS
SELECT o.Id, o.OrderDate, o.LastName, o.TotalPrice, s.Status
FROM dbo.Orders o INNER JOIN dbo.OrderStatus s on o.Id = s.OrderId
WHERE NOT EXISTS (SELECT NULL from dbo.OrderStatus where OrderId = s.OrderId and StatusDate > s.StatusDate
AND (EXISTS (SELECT NULL FROM dbo.OrderLineItemType1 WHERE OrderId = o.Id)
OR EXISTS (SELECT NULL FROM dbo.OrderLineItemType2 WHERE OrderId = o.Id))
bastante fácil, pero acabo de tener un requisito añadido para mostrar si un pedido contiene elementos de línea de tipo 1 o tipo 2 (o ambos) en la red donde se muestran estos resultados:
Order ID | T1 | T2 | Last name | Price | Status ============================================================ 12345 | x | | Smith | $100.00 | In Production 12346 | x | x | Jones | $147.23 | Part Dispatched 12347 | | x | Atwood | $12.50 | Dispatched
el único La forma en que puedo pensar es hacer:
CREATE VIEW OrdersView WITH SCHEMABINDING AS
SELECT o.Id,
CASE WHEN EXISTS (SELECT NULL FROM dbo.OrderLineItemType1 WHERE OrderID = o.Id) THEN 1 ELSE 0 END AS HasType1,
CASE WHEN EXISTS (SELECT NULL FROM dbo.OrderLineItemType2 WHERE OrderId = o.ID) THEN 1 ELSE 0 END AS HasType2,
o.OrderDate, o.LastName, o.TotalPrice, s.Status
FROM dbo.Orders o INNER JOIN dbo.OrderStatus s on o.Id = s.OrderId
WHERE NOT EXISTS (SELECT NULL from dbo.OrderStatus where OrderId = s.OrderId and StatusDate > s.StatusDate
AND (EXISTS (SELECT NULL FROM dbo.OrderLineItemType1 WHERE OrderId = o.Id)
OR EXISTS (SELECT NULL FROM dbo.OrderLineItemType2 WHERE OrderId = o.Id))
Pero esto huele mal con la duplicación de las cláusulas EXISTS
. ¿Hay una mejor manera de escribirlo? ¿Puedo hacerlo funcionar mejor?
SELECT null'? No he visto código usando un constructo así durante bastante tiempo: arreglaron el optimizador de modo que 'SELECT *' en las cláusulas 'EXISTS' sea tan eficiente (si no más) que las construcciones alternativas de nuevo, creo, SQL Servidor 2000 (si no es anterior) –
@Damien No escribí la vista original: P – Jon
Si examina el plan de ejecución, ¿cuántos escaneos/búsquedas contra las tablas OrderLineItemTypeX hay? Si solo hay uno, entonces el optimizador ha sido lo suficientemente inteligente para detectar que solo lo necesita una vez, y es poco probable que mejore el rendimiento (pero puede haber mejores formas de escribirlo, aún pensando en eso) –