2012-05-23 2 views
1

Je travaille sur quelques extensions de Gerrit. J'ai la requête suivante pour obtenir les COMMUTATIONS TOTALES, COMMENTAIRES TOTOAL d'examen ... etc. pour un ACCOUNT_ID particulier de la DB de gerrit.Exécuter une requête de compte pour chaque compte

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; 

Maintenant, avec la requête ci-dessus, je peux obtenir les trois comptes pour un utilisateur. Je veux exécuter la requête ci-dessus pour tous les ACCOUNT_ID. Quelque chose comme exécuter cette requête pour chaque compte (pas seulement pour 1001961 ici) et récupérer tous les enregistrements en une seule fois pour tous les comptes.

table CONSIDERATION les colonnes suivantes:

"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 

Je préférerais ne pas utiliser les procédures.

P.S. - Je crains pour Oracle SQL.

+1

Ne pas citer explicitement les colonnes lors de la création de tables/vues, etc. Cela cause plus de problèmes que cela en vaut la peine. Si vous ne les citez pas, tout est supposé être en majuscules (quelle que soit la façon dont vous les tapez) et vous n'avez pas besoin de faire quoi que ce soit. Cela économise aussi beaucoup de frappe. – Ben

Répondre

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 
; 

Les CTE calculent maintenant les valeurs pour chaque utilisateur. La sélection finale suppose que vous avez un tableau user qui répertorie tous vos utilisateurs.

Si vous filtrez la requête finale par utilisateur, les CTE calculent uniquement les résultats pour les utilisateurs dans les résultats finaux.

+0

Merci. J'ai essayé ceci mais le compte pour TOT_PATCH_COMMENTS est faux et TOT_CHANGE_MESSAGES est nul. Bien que le compte pour TOT_CHANGES soit correct. – rahul

+0

occasion ceci: LEFT JOIN patchcommentstoothers pcto SUR ACCOUNTS.ACCOUNT_ID = pcto.AUTHOR_ID GAUCHE REJOIGNEZ ownerchanges oc SUR ACCOUNTS.ACCOUNT_ID = oc.owner_account_ID LEFT JOIN changemessages cm SUR ACCOUNTS.ACCOUNT_ID = cm.AUTHOR_ID – rahul

+0

@rahul - J'ai raté le '! =' Dans l'un de vos CTE, et j'ai mal écrit la clause 'WHERE' dans l'un des autres. Les modifications devraient corriger celles pour vous. J'espère que vous pouvez utiliser le modèle et développer avec vos propres connaissances (en pleine croissance);) – MatBailie

Questions connexes