2012-05-23 42 views
1

我正在對Gerrit進行一些擴展。我有以下查詢來從gerrit DB獲取特定ACCOUNT_ID的TOTAL COMMITS,TOTOAL REVIEW COMMENTS ...等。每個帳戶的運行計數查詢

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)並一次性爲所有帳戶取回所有記錄。

ACCOUNT表有以下欄目:

"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爲空。雖然TOT_CHANGES的計數是正確的。 – rahul

+0

使用這個代替: LEFT JOIN patchcommentstoothers pcto ON ACCOUNTS.ACCOUNT_ID = pcto.AUTHOR_ID 左連接 ownerchanges OC ON ACCOUNTS.ACCOUNT_ID = oc.owner_account_ID LEFT JOIN changemessages釐米 ON ACCOUNTS.ACCOUNT_ID = cm.AUTHOR_ID – rahul

+0

@rahul - 我在你的一個CTE中錯過了'!=',並且在其他人中錯誤地寫了'WHERE'子句。編輯應該糾正那些給你。希望你可以使用這個模板,並用你自己的(不斷增長的)知識擴展它;) – MatBailie

相關問題