2012-05-23 4 views
1

Я работаю над некоторыми расширениями для Gerrit. У меня есть следующий запрос, чтобы получить ОБЩИЕ КОМИТЕТЫ, ОБЩИЙ ОБЗОР КОММЕНТАРИИ ... и т. Д. Для конкретного ACCOUNT_ID из gerrit DB.запрос количества запросов для каждой учетной записи

with 
    changeids as 
    (select change_id from PATCH_SETS where UPLOADER_ACCOUNT_ID=1001961), 
    patchcommentstoothers as 
    (select count(*) c from patch_comments where AUTHOR_ID!=1001961 AND Change_id in (select change_id from changeids)), 
    ownerchanges as 
    (select count(*) c from changes where owner_account_ID=1001961 and OPEN='Y'), 
    changemessages as 
    (select count(*) c from change_messages where AUTHOR_ID=1001961 and change_id not in (select change_id from changeids)) 
select pcto.c TOT_PATCH_COMMENTS, oc.c TOT_CHANGES, cm.c TOT_CHANGE_MESSAGES 
from patchcommentstoothers pcto, ownerchanges oc, changemessages cm; 

Теперь с вышеуказанным запросом я могу получить три счета для одного пользователя. Я хочу запустить указанный выше запрос для всех ACCOUNT_ID. Что-то вроде запускать этот запрос для каждой учетной записи (не только для 1001961 здесь) и вернуть все записи за один раз для всех учетных записей.

СЧЕТ таблица имеет следующие столбцы:

"REGISTERED_ON" TIMESTAMP (6) NOT NULL ENABLE, 
"FULL_NAME"  VARCHAR2(255 BYTE), 
"PREFERRED_EMAIL" VARCHAR2(255 BYTE), 
"CONTACT_FILED_ON" TIMESTAMP (6), 
"MAXIMUM_PAGE_SIZE" NUMBER(6,0) DEFAULT 0, 
"SHOW_SITE_HEADER" CHAR(1 BYTE) DEFAULT 'N', 
"USE_FLASH_CLIPBOARD" CHAR(1 BYTE) DEFAULT 'N', 
"DOWNLOAD_URL"  VARCHAR2(20 BYTE), 
"DOWNLOAD_COMMAND" VARCHAR2(20 BYTE), 
"COPY_SELF_ON_EMAIL" CHAR(1 BYTE) DEFAULT 'N', 
"DATE_FORMAT"   VARCHAR2(10 BYTE), 
"TIME_FORMAT"   VARCHAR2(10 BYTE), 
"INACTIVE"   CHAR(1 BYTE) DEFAULT 'N', 
"ACCOUNT_ID"   NUMBER(11,0) DEFAULT 0 

Я предпочел бы не использовать процедуры.

P.S. - Я сосать Oracle SQL.

+1

Не указывайте столбцы при создании таблиц/представлений и т. Д. Это вызывает больше проблем, чем того стоит. Если вы не процитируете их, то предполагается, что все считается заглавным (однако вы его вводите), и вам не нужно ничего делать. Это также экономит много ввода. – Ben

ответ

1
with 
    changeids 
as 
(
    select 
    UPLOADER_ACCOUNT_ID, 
    change_id 
    from 
    PATCH_SETS 
    group by 
    UPLOADER_ACCOUNT_ID, 
    change_id 
), 
    patchcommentstoothers 
as 
(
    select 
    changeids.UPLOADER_ACCOUNT_ID, 
    count(*) c 
    from 
    changeids 
    inner join 
    patch_comments 
     ON changeids.UPLOADER_ACCOUNT_ID != patch_comments.AUTHOR_ID 
     AND changeids.change_id   = patch_comments.change_id 
    group by 
    changeids.UPLOADER_ACCOUNT_ID 
), 
    ownerchanges 
as 
(
    select 
    owner_account_ID, 
    count(*) c 
    from 
    changes 
    where 
    OPEN='Y' 
    group by 
    owner_account_ID 
), 
    changemessages 
as 
(
    select 
    change_messages.AUTHOR_ID, 
    count(*) c 
    from 
    change_messages 
    left join 
    changeids 
     on changeids.UPLOADER_ACCOUNT_ID = change_messages.AUTHOR_ID 
     AND changeids.change_id   = change_messages.change_id 
    where 
    changeids.change_id IS NULL 
    group by 
    change_messages.AUTHOR_ID 
) 

select 
    accounts.ACCOUNT_ID, 
    pcto.c TOT_PATCH_COMMENTS, 
    oc.c  TOT_CHANGES, 
    cm.c  TOT_CHANGE_MESSAGES 
from 
    accounts 
LEFT JOIN 
    patchcommentstoothers pcto 
    ON accounts.ACCOUNT_ID = pcto.UPLOADER_ACCOUNT_ID 
LEFT JOIN 
    ownerchanges   oc 
    ON accounts.ACCOUNT_ID = oc.owner_account_ID 
LEFT JOIN 
    changemessages  cm 
    ON accounts.ACCOUNT_ID = cm.AUTHOR_ID 
; 

CTE теперь вычисляют значения для каждого пользователя.

Окончательный выбор предполагает, что у вас есть таблица user, в которой перечислены все ваши пользователи.

Если вы фильтруете окончательный запрос пользователем, CTE рассчитывают только результаты для пользователей в конечных результатах.

+0

Спасибо. Я попробовал это, но счетчик для TOT_PATCH_COMMENTS ошибочен, а TOT_CHANGE_MESSAGES - null. Хотя счетчик для TOT_CHANGES прав. – rahul

+0

Используемые вместо этого: LEFT JOIN patchcommentstoothers pcto ПО ACCOUNTS.ACCOUNT_ID = pcto.AUTHOR_ID LEFT JOIN ownerchanges ос ПО ACCOUNTS.ACCOUNT_ID = oc.owner_account_ID LEFT JOIN changemessages см ПО ACCOUNTS.ACCOUNT_ID = cm.AUTHOR_ID – rahul

+0

@rahul - я пропустил '! =' В одном из ваших CTE, и я неправильно написал предложение WHERE в одном из других. Редакции должны исправить их для вас. Надеюсь, вы можете использовать шаблон и расширять его своими собственными (растущими) знаниями;) – MatBailie

Смежные вопросы