![]() |
#20 |
Moderator
|
2 Владимир Максимов
Владимир, конечно же есть такая фича COUNT(DISTINCT ) и в Оракле. Не могу сказать, что она в данном случае сильно спасает, так как номера партий все равно нужно откуда-то доставать. Обычно подобные запросы я пишу с использованием фразы WITH, и тогда повторяющийся фрагмент (который "ЕЩЕ РАЗ увы") выносится за "скобки" основного запроса и прописывается один раз перед ним: Код: WITH Tmp01 AS (SELECT InventSerialId, InventBatchId FROM InventDim INNER JOIN InventTrans ON InventDim.InventDimId = InventTrans.InventDimId WHERE InventSerialId <> CHR(2) --// CHR(2) - аксаптовский null для Oracle GROUP BY InventSerialId, InventBatchId ) --// уникальные сочетания серийника и партии, встречающиеся в InventTrans SELECT Tmp01.InventSerialId AS "Серийный номер", Tmp02.Cnt AS "Кол-во повторений", --// ...этого серийника для разных номеров партий Tmp01.InventBatchId AS "Номер партии" FROM Tmp01 INNER JOIN (SELECT InventSerialId, COUNT(*) AS Cnt FROM Tmp01 GROUP BY InventSerialId HAVING COUNT(*) <> 1 ) Tmp02 --// уникальные серийники из уникальных сочетаний серийник+партия ON Tmp01.InventSerialId = Tmp02.InventSerialId ORDER BY Tmp01.InventSerialId, Tmp01.InventBatchId Но вообще речь-то не обо всем об этом. ![]() Цель другая - показать, как довольно сложный запрос SQL можно достаточно прозрачно реализовать в Аксапте серией последовательных простых select'ов на основе временных таблиц, которые не нужно готовить заранее! А также показать, как в рамках одного метода (джоба) можно фактически реализовать вычисления типа SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM... ))))) Нельзя в лоб сделать в аксаптовском select'е одновременно группировку и сортировку (причем, убывающую)? Пожалуйста, разделим процесс на 2 запроса. А если что-то посложнее, то и на 3, и на 4, и на более. |
|