不确定标题是否能很好地解释问题;这就是我正在使用的,
我有以下表格,
-- 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
.
.
.
可能很简单,但我无法理解。
答案 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_t
和kv.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
值将包含在此查询的结果中,但如果表已加入则排除。