ник: MS_4G
Спасибо коллегам, по рекомендации которых я сформировал нижеследующий фрагмент (представление НЕПУСТОЕ), который решает поставленную задачу:
SELECT dbo.Заказчики.КодЗаказчика, dbo.Заказчики.ИмяЗаказчика, dbo.Заказы.КодЗаказа, dbo.Заказы.ДатаЗаказа, dbo.Заказы.ОбъемЗаказа
FROM dbo.Заказчики INNER JOIN
dbo.Заказы ON dbo.Заказчики.КодЗаказчика = dbo.Заказы.КодЗаказчика INNER JOIN
(SELECT Заказчики_1.КодЗаказчика, MAX(Заказы_1.ДатаЗаказа) AS MD
FROM dbo.Заказчики AS Заказчики_1 INNER JOIN
dbo.Заказы AS Заказы_1 ON Заказчики_1.КодЗаказчика = Заказы_1.КодЗаказчика
GROUP BY Заказчики_1.КодЗаказчика) AS zw ON dbo.Заказчики.КодЗаказчика = zw.КодЗаказчика AND dbo.Заказы.ДатаЗаказа = zw.MD
В этом представлении Заказчики, у которых вообще нет Заказов, не выводятся.
Поскольку задача модельная, могут быть ситуации, когда, напротив, Заказчики, у которых вообще нет Заказов, должны выводиться. Казалось бы, следующий фрагмент (представление КВАЗИПУСТОЕ) должен это реализовать, однако здесь также Заказчики, у которых вообще нет Заказов, не выводятся:
SELECT dbo.Заказчики.КодЗаказчика, dbo.Заказчики.ИмяЗаказчика, dbo.Заказы.КодЗаказа, dbo.Заказы.ДатаЗаказа, dbo.Заказы.ОбъемЗаказа
FROM dbo.Заказчики INNER JOIN
dbo.Заказы ON dbo.Заказчики.КодЗаказчика = dbo.Заказы.КодЗаказчика INNER JOIN
(SELECT Заказчики_1.КодЗаказчика, MAX(Заказы_1.ДатаЗаказа) AS MD
FROM dbo.Заказчики AS Заказчики_1 INNER JOIN
dbo.Заказы AS Заказы_1 ON Заказчики_1.КодЗаказчика = Заказы_1.КодЗаказчика
GROUP BY Заказчики_1.КодЗаказчика) AS zw ON dbo.Заказчики.КодЗаказчика = zw.КодЗаказчика AND (zw.MD IS NULL OR
dbo.Заказы.ДатаЗаказа = zw.MD)
Чтобы выводить Заказчиков, у которых вообще нет Заказов, пришлось составить вспомогательное представление zw:
SELECT dbo.Заказчики.КодЗаказчика, MAX(dbo.Заказы.ДатаЗаказа) AS MD
FROM dbo.Заказчики LEFT OUTER JOIN
dbo.Заказы ON dbo.Заказы.КодЗаказчика = dbo.Заказчики.КодЗаказчика
GROUP BY dbo.Заказчики.КодЗаказчика
и такой фрагмент (представление ПУСТОЕ), который это вспомогательное представление использует:
SELECT dbo.Заказчики.КодЗаказчика, dbo.Заказчики.ИмяЗаказчика, dbo.Заказы.КодЗаказа, dbo.Заказы.ДатаЗаказа, dbo.Заказы.ОбъемЗаказа
FROM dbo.Заказчики LEFT OUTER JOIN
dbo.Заказы ON dbo.Заказчики.КодЗаказчика = dbo.Заказы.КодЗаказчика INNER JOIN
dbo.zw ON dbo.Заказчики.КодЗаказчика = dbo.zw.КодЗаказчика AND (dbo.zw.MD IS NULL OR
dbo.Заказы.ДатаЗаказа = dbo.zw.MD)
Поскольку в обоих вариантах поставленная задача получается решенной, можно было бы и успокоиться. Тем не менее есть еще вопросы, и если кто-то знает ответы, пожалуйста, подскажите:
1. Можно ли как-то исправить фрагмент (представление КВАЗИПУСТОЕ) или сочинить что-то иное, чтобы все же выводить Заказчиков, у которых вообще нет Заказов.
2. Если "Да", то будет ли это более эффективно прежде всего по скорости работы, но и по удобству составления таких представлений на будущее (на основе этой модельной задачи должны будут потом аналогичным образом решаться и некоторые другие задачи).
Заранее спасибо.