2015-08-30 4 views
1

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

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

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

ответ

1

Трюк здесь заключается в использовании атрибута r_object_typedm_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) 

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

+0

Я думал о том же, но мне нужен выходной результат, например count (obj_type_A), count (obj_Type_B), i_folder_id. Если я получу результат в вышеуказанном формате, то который будет действовать как флаг в моем коде, который сделает итерацию более миллионами данных немного быстрой. – dnup1092

+0

ОК, я отредактировал свой ответ. Пожалуйста, поддержите его как полезный, и отметьте его как правильно. – eivamu

+0

отредактированный запрос даст мне результат, например 'count, type, i_folder', если я не ошибаюсь. Предположим, у меня есть только два настраиваемых типа type_A и type_B, и мне нужно получить количество обоих типов документов в папке . Возможно получить счетчик как object_type в одной строке с i_folder_id. Итак, схема, в которой я хочу быть результатом, это 'count (type_A), count (type_B), i_folder_id.' В raw sql это можно сделать, используя подзапрос в select. Th – dnup1092