Как получить количество различных типов документов в папке с помощью DQL

У меня есть два типа документов: obj_type_A и obj_type_B, которые могут находиться или не находиться в папке типа obj_type_fldr.

Мне нужно получить количество обоих документов, присутствующих в папке типа obj_type_fldr.

Если бы у него был sql, мы могли бы написать подзапрос в предложении select. Но DQL не поддерживал эту функцию.


person dnup1092    schedule 30.08.2015    source источник


Ответы (1)


Хитрость здесь заключается в использовании атрибута r_object_type для dm_sysobject. Итак, то, что вы хотите, вероятно, достижимо только в том случае, если оба ваших пользовательских типа являются потомками dm_sysobject. И в этом случае, как вы это делаете.

Базовый подсчет

SELECT count(r_object_id), r_object_type 
FROM dm_sysobject
WHERE ANY i_folder_id IN (
    SELECT r_object_id 
    FROM obj_type_fldr
) 
AND r_object_type IN ('obj_type_A','obj_type_B') 
GROUP BY r_object_type

Пример вывода:

dm_attr_0001  r_object_type
------------  --------------------------------
         271  obj_type_A
         195  obj_type_B
(2 rows affected)

Счетчик на папку

Кроме того, если вы хотите подсчитать, сколько документов находится в каждой папке, просто добавьте i_folder_id к вашему запросу следующим образом:

SELECT count(r_object_id), r_object_type, i_folder_id 
FROM dm_sysobject
WHERE ANY i_folder_id IN (
    SELECT r_object_id 
    FROM obj_type_fldr
) 
AND r_object_type IN ('obj_type_A','obj_type_B') 
GROUP BY r_object_type, i_folder_id

Пример вывода:

dm_attr_0001  r_object_type     i_folder_id
------------  ----------------  ----------------
         271  obj_type_A        0b00000080000001
         100  obj_type_B        0b00000080000001
          95  obj_type_B        0b00000080000002
(3 rows affected)

Конечно, вы можете расширить этот запрос дополнительными предложениями, например. для подсчета только документов, которые находятся в пределах определенного пути, но общее представление вы уловили.

person eivamu    schedule 30.08.2015
comment
я думал о том же, но мне нужен результат вывода, например count (obj_type_A), count (obj_Type_B), i_folder_id. Если я получу результат в указанном выше формате, то это будет действовать как флаг в моем коде, который немного ускорит итерацию по миллионам данных. - person dnup1092; 30.08.2015
comment
Хорошо, я отредактировал свой ответ. Пожалуйста, оцените это как полезное и отметьте как правильное. - person eivamu; 30.08.2015
comment
отредактированный запрос даст мне результат, подобный count,type,i_folder, если я не ошибаюсь. Допустим, у меня есть только два настраиваемых типа type_A и type_B, и мне нужно получить количество обоих типов документов в папке. Возможно ли получить подсчет обоих object_type в одной строке с i_folder_id. Таким образом, схема, которую я хочу получить, - это count(type_A),count(type_B),i_folder_id. В необработанном sql это можно сделать, используя подзапрос в select. Чт - person dnup1092; 30.08.2015
comment
Это сложнее. Дай мне подумать. А пока, пожалуйста, прочитайте вводную страницу для stackoverflow о том, как здесь все работает. Теперь мой ответ правильный относительно вашего вопроса. Stackoverflow — это не дискуссионный форум, это место для вопросов и ответов :) - person eivamu; 30.08.2015
comment
Хм, новичок в сообществе :) . Поддержу ответ. и принять его. Я думаю, что у EMC должна быть возможность разрешить подзапрос в предложении select. - person dnup1092; 30.08.2015
comment
Спасибо :) Я согласен с вами там. Что ж, я подумал над вашим вопросом, и единственное решение — использовать зарегистрированное представление, если вы хотите, чтобы это было однострочным ответом, а затем запросить это зарегистрированное представление из DQL. Ваше представление должно выбирать из обеих таблиц dm_sysobject_s и dm_sysobject_r в вашей базе данных. Первый содержит только одну строку для каждого идентификатора, второй (который содержит i_folder_id) содержит несколько строк для каждого идентификатора. Дополнительная информация здесь: community.emc.com/message/579811 - person eivamu; 30.08.2015
comment
Но представления не обновляются регулярно (обновляются только материализованные представления, которые тоже обновляются в течение периода времени, настроенного администратором, верно?), если я не ошибаюсь. Так что в этом случае есть некоторая вероятность получить устаревшие данные. Верно? - person dnup1092; 30.08.2015
comment
Я думаю, вы правы. Я бы сам использовал запрос, предложенный в моем первоначальном ответе, а затем использовал код (Java) для сортировки вывода так, как я этого хочу. Но я прекрасно понимаю, что это не всегда возможно. - person eivamu; 30.08.2015