I have an idea that something like
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)
The goal is to get all orders that have at least one type 1 line item together with their current status.
We add the second type of line item, and I changed the view so that it would include orders that have at least one line item of type 1 or 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))
Easy enough, but I just had a requirement added to show if the order contains rows of type 1 or 2 (or both) in the grid where these results are displayed:
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
The only way I can think of is to do this:
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))
But it smells bad of duplicating EXISTS sentences. Is there a better time to write? Can I make it work better?
sql sql-server sql-server-2008
Jon
source share