0

タイトルが問題をうまく説明しているのかわからない。これは私が取り組んでいるものです、

私は次の表を持っています、

-- table = kms_doc_ref_currnt_v
DOC_ID    VARCHAR2(19)
TO_DOC_ID    VARCHAR2(19)
BRANCH_ID    NUMBER(8)
REF_TYP_CD    VARCHAR2(20)

-- table = kms_fil_nm_t
DOC_ID    VARCHAR2(19)    PRIMARY KEY    UNIQUE

たとえば、このクエリを使用して、59678がの1つの値でkms_doc_ref_currnt_vある、を持つすべてのレコードのカウントを取得できます。to_doc_id = 59678kms_fil_nm_t

select 'doc_id 59678 has ' || count(to_doc_id) as cnt from kms_doc_ref_currnt_v where branch_id=1 and ref_typ_cd in ('CONREF', 'KBA') and to_doc_id=59678;

kms_doc_ref_currnt_v.to_doc_id値の1つを持つフィールドkms_fil_nm_t.doc_idです。kms_doc_ref_currnt_v.doc_idもの値の1つですkms_fil_nm_t

私が探している単一のクエリは、それぞれをループし、類似した。を持つkms_fil_nm_t.doc_idすべての行をカウントします。返される各行は、上記のクエリの出力のようになります。これが出力例です。kms_doc_ref_currnt_vto_doc_id

doc_id 1 has 32
doc_id 2 has 314
doc_id 3 has 2718
doc_id 4 has 42
doc_id 5 has 128
doc_id 6 has 11235
.
.
.

おそらく単純ですが、私には理解できません。

4

2 に答える 2

1

2つのテーブルで結合を実行し、次のようにGROUP BY句を追加します。

    SELECT 'doc_id 59678 has ' || count(to_doc_id) as cnt 
    FROM kms_doc_ref_currnt_v kv, kms_fil_nm_t kt
    WHERE kt.doc_id= kv.to_doc_id 
          AND kv.branch_id=1 
          AND kv.ref_typ_cd in ('CONREF', 'KBA') 
          AND kv.to_doc_id=59678
    GROUP BY kv.to_doc_id;     

編集:

およびでkms_doc_ref_currnt_vの参照の可用性に関係なく、すべてのレコードを取得するには、次のようにします。kms_fil_nm_tkv.to_doc_id=59678

    SELECT 'doc_id 59678 has ' || count(to_doc_id) as cnt 
    FROM kms_doc_ref_currnt_v kv 
         LEFT JOIN kms_fil_nm_t kt
         ON (kt.doc_id= kv.to_doc_id )
    WHERE  kv.branch_id=1 
          AND kv.ref_typ_cd in ('CONREF', 'KBA') 
    GROUP BY kv.to_doc_id; 

ハードコーディングを置き換えるには、次の59678ように記述します。

    SELECT 'doc_id ' || kt.doc_id || ` has ' || count(to_doc_id) as cnt 
    FROM kms_doc_ref_currnt_v kv 
         LEFT JOIN kms_fil_nm_t kt
         ON (kt.doc_id= kv.to_doc_id )
    WHERE  kv.branch_id=1 
          AND kv.ref_typ_cd in ('CONREF', 'KBA') 
    GROUP BY kv.to_doc_id, kt.doc_id; 
于 2012-10-21T20:53:10.900 に答える
1

すべての値を持つ駆動テーブルと、一致するエントリがある場合とない場合がある従属テーブルの間で外部結合を使用する必要があります。集計関数( )が何に対して動作するかを定義する句doc_id。何かのようなもの:group bycount()

select 'doc_id ' || t.doc_id || ' has ' || count(*)
from kms_fil_nm_t t
left join kms_doc_ref_currnt_v v
on v.to_doc_id = t.doc_id
and v.branch_id = 1
and v.ref_typ_cd in ('CONREF', 'KBA')
group by t.doc_id;

これは、が使用されていないことを知りたいことを前提としているため、のdoc_idようなエントリが必要ですdoc_id 1234 has 0。それらを見たくない場合は、外側の代わりに内側の結合を使用できます-基本的に単語を削除するだけですleft-しかし、その場合は、実際にはまったく結合する必要はありません。次のようにするだけです。

select 'doc_id ' || v.to_doc_id || ' has ' || count(*)
from kms_doc_ref_currnt_v v
where v.branch_id = 1
and v.ref_typ_cd in ('CONREF', 'KBA')
group by v.to_doc_id;

他のテーブルにないto_doc_id値がない限り、このクエリの結果には含まれますが、テーブルが結合されている場合は除外されます。

于 2012-10-22T07:12:17.657 に答える