子表中不存在的计数

时间:2013-05-23 17:57:03

标签: sql oracle

基本上我要做的是计算审计/历史表中不存在的行数。我希望以下查询返回每个细节一个计数。目前它在历史表中每行给我一个。

--Detail Table
ID    DETAIL_GROUP
1     A
2     B
3     B

--Detail History Table
DETAIL_ID_FK    VALUE1
1               NOT_MATCH
1               NOT_MATCH
2               MATCH
2               NOT_MATCH
3               MATCH
3               NOT_MATCH

SELECT D.DETAIL_GROUP, COUNT(*)
FROM DETAIL D
WHERE (NOT EXISTS(
          SELECT NULL
          FROM DETAIL_HISTORY HI 
          WHERE HI.D_ID_FK = D.ID 
          AND HI.VALUE1 = 'MATCH'))
GROUP BY D.DETAIL_GROUP; 

我希望看到以下结果:

DETAIL_GROUP    COUNT(*)
A               1

但我收到了以下结果:

DETAIL_GROUP    COUNT(*)
A               2

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

假设您的详细信息表如下:

D_ID    VALUE1
1       MATCH
1       NOT_MATCH
2       MATCH
2       NOT_MATCH
3       MATCH
3       NOT_MATCH

以下查询:

SELECT d.detail_group, count(*)
FROM detail d
JOIN detail_history dh ON dh.d_id = d.id 
WHERE dh.value1 = 'MATCH'
GROUP BY d.detail_group

会产生:

DETAIL_GROUP    COUNT(*)
A                   1
B                   2

上述查询会创建与ID匹配的组,然后进入每个组并根据value1限制项目。