ник: MS_4G
В процессе обсуждения с коллегами выяснилось, что для решения этой задачи надо использовать APPLY, причем, как оказывается, эту штуку при построении представлений нельзя использовать в конструкторе запросов, а только в сценарии. После этого все проблемы были решены.
Ниже привожу два варианта (с учетом всех уточнений постановки задачи): первый View_Order выводит требуемые сведения только для тех Заказчиков, у которых фактически есть хотя бы один Заказ, второй View_Order_Nulls выводит требуемые сведения для всех зарегистрированных Заказчиков, причем для тех Заказчиков, у которых Заказов нет, выводится Null.
Теперь вопрос закрыт полностью.
USE [Base]
GO
/****** Object: View [dbo].[View_Order] Script Date: 06/04/2009 14:07:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[View_Order] AS
WITH T_ALL AS
(SELECT t1.КодЗаказчика, t1.ИмяЗаказчика, t2.КодЗаказа, t2.ДатаЗаказа, t2.ОбъемЗаказа
FROM dbo.Заказчики AS t1 INNER JOIN dbo.Заказы AS t2 ON t1.КодЗаказчика = t2.КодЗаказчика)
SELECT * FROM
(SELECT КодЗаказчика, ИмяЗаказчика
FROM dbo.Заказчики) t3 CROSS APPLY
(SELECT TOP 1 КодЗаказа, ДатаЗаказа, ОбъемЗаказа FROM T_ALL
WHERE T_ALL.КодЗаказчика = t3.КодЗаказчика ORDER BY ДатаЗаказа DESC) t4
USE [Base]
GO
/****** Object: View [dbo].[View_Order_Nulls] Script Date: 06/04/2009 14:11:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[View_Order_Nulls] AS
WITH T_ALL AS (SELECT t1.КодЗаказчика, t1.ИмяЗаказчика, t2.КодЗаказа, t2.ДатаЗаказа, t2.ОбъемЗаказа
FROM dbo.Заказчики AS t1 INNER JOIN dbo.Заказы AS t2 ON t1.КодЗаказчика = t2.КодЗаказчика)
SELECT * FROM (SELECT КодЗаказчика, ИмяЗаказчика FROM dbo.Заказчики) t3 OUTER APPLY
(SELECT TOP 1 КодЗаказа, ДатаЗаказа, ОбъемЗаказа FROM T_ALL WHERE T_ALL.КодЗаказчика = t3.КодЗаказчика
ORDER BY ДатаЗаказа DESC) t4