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;

上記のクエリを使用すると、1 人のユーザーの 3 つのカウントを取得できます。すべての 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

プロシージャを使用しないことをお勧めします。

PS - 私は Oracle SQL が苦手です。

4

1 に答える 1

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は最終結果のユーザーの結果のみを計算します。

于 2012-05-23T08:13:49.397 に答える