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

例如,我可以使用这个查询来计算所有kms_doc_ref_currnt_v具有 a 的记录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
.
.
.

可能很简单,但我就是想不通。

4

2 回答 2

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; 
于 2012-10-21T20:53:10.900 回答
1

您需要在具有所有值的驱动表和可能具有或不具有匹配条目的依赖表之间使用外连接;doc_id和一个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不使用 a,因此您需要类似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 回答