对于一个表的每一行,计算另一个表中指向Oracle中每个行的条目

时间:2012-10-21 20:46:50

标签: oracle join group-by

不确定标题是否能很好地解释问题;这就是我正在使用的,

我有以下表格,

-- 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

例如,我可以统计所有kms_doc_ref_currnt_v条记录to_doc_id = 59678,其中59678是kms_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是一个具有kms_fil_nm_t.doc_id值之一的字段。 kms_doc_ref_currnt_v.doc_id也是kms_fil_nm_t中的值之一。

我正在查找的单个查询将遍历每个kms_fil_nm_t.doc_id并计算kms_doc_ref_currnt_v中具有类似to_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
.
.
.

可能很简单,但我无法理解。

2 个答案:

答案 0 :(得分:1)

使用两个表进行连接并添加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; 

答案 1 :(得分:1)

您需要在具有所有doc_id值的驱动表和可能具有或不具有匹配条目的从属表之间使用outer join;和group by子句定义您的聚合函数(count())正在运行的内容。类似的东西:

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值将包含在此查询的结果中,但如果表已加入则排除。