Sql Oracle:如何连接两个结果集查询(基于同一个表),然后减去结果?

Sql Oracle:如何连接两个结果集查询(基于同一个表),然后减去结果?,sql,oracle,Sql,Oracle,我的问题 我有两个查询具有相同的select和from条件,但具有不同的where语句。每个查询统计“操作”的数量。第一个查询统计创建的所有文件,而另一个查询统计已删除的所有文件。要获得更新的文件计数,我需要将它们合并,然后从created的结果集计数中减去deleted的结果集计数 以下是我的两个问题。它们基本相同,只是其中一个创建了table2.Audited=15,另一个删除了table2.Audited=14 创建: SELECT decode(table1.id, 2984, 'Cat

我的问题

我有两个查询具有相同的select和from条件,但具有不同的where语句。每个查询统计“操作”的数量。第一个查询统计创建的所有文件,而另一个查询统计已删除的所有文件。要获得更新的文件计数,我需要将它们合并,然后从created的结果集计数中减去deleted的结果集计数

以下是我的两个问题。它们基本相同,只是其中一个创建了table2.Audited=15,另一个删除了table2.Audited=14

创建:

SELECT decode(table1.id,
2984, 'Category 1',
3298, 'Category 2',
2390, 'Category 3',
4039, 'Category 4',
5048, 'Category 5',
'Unknown') "Category",
COUNT (table1.id) AS "Files Created"
FROM table1
JOIN
maintable ON maintable.dataid = table1.id
JOIN 
table2 ON table2.dataid = maintable.id
JOIN
table3 ON table3.id = table2.userid
WHERE table2.auditid = 15
AND auditdate >= %1
AND table2.subtype = 0
AND table1.subtype = -18
GROUP BY table1.id
删除:

SELECT decode(table1.id,
2984, 'Category 1',
3298, 'Category 2',
2390, 'Category 3',
4039, 'Category 4',
5048, 'Category 5',
'Unknown') "Category",
COUNT (table1.id) AS "Files Created"
FROM table1
JOIN
maintable ON maintable.dataid = table1.id
JOIN 
table2 ON table2.dataid = maintable.id
JOIN
table3 ON table3.id = table2.userid
WHERE table2.auditid = 14
AND auditdate >= %1
AND table2.subtype = 0
AND table1.subtype = -18
GROUP BY table1.id
请注意,这些查询本身运行良好


我尝试过的

  • 我不能使用减号语句,因为它对结果集不起作用(我忘记了这一点,以前问过这个问题)
  • 我曾尝试将这两个查询嵌套为子查询,并使用union等,但无法使其工作
  • 我已经尝试了()中描述的方法。这给了我错误ORA-00904字符串无效标识符“table1.id”
以下是我改编的代码:

select decode(table1.id,
2984, 'Category 1',
3298, 'Category 2',
2390, 'Category 3',
4039, 'Category 4',
5048, 'Category 5',
'Unknown') "Category", 
(filescreated.CNT - filesdeleted.CNT) as "Final Count", 
from (
 SELECT table1.id, 
 COUNT(table1.id) as CNT
 FROM table1
 JOIN
 maintable ON maintable.dataid = table1.id
 JOIN 
 table2 ON table2.dataid = maintable.id
 JOIN
 table3 ON table3.id = table2.userid
 WHERE table2.auditid = 15
 AND auditdate >= %1
 AND table2.subtype = 0
 AND table1.subtype = -18
 GROUP BY table1.id) filescreated,
    (SELECT table1.id,
    COUNT(llattrdata.defid) as CNT
    FROM table1
    JOIN
    maintable ON maintable.dataid = table1.id
    JOIN 
    table2 ON table2.dataid = maintable.id
    JOIN
    table3 ON table3.id = table2.userid
    WHERE table2.auditid = 14
    AND auditdate >= %1
    AND table2.subtype = 0
    AND table1.subtype = -18
    GROUP BY table1.id) filesdeleted

ORDER BY table1.id
有人能提供一些见解吗?

在您的“已删除”查询块中,您仍然在
选择列表中提供列名
“已创建的文件”
;我认为这是一个错误,应该是
“已删除的文件”
,对吗

回答您的问题:您似乎可以识别由
表2“创建”和“删除”的文件。audited
属性是否正确?15表示已创建,14表示已删除

要在单个查询中捕获这两个条件,最后一组
条件中的那一部分应该成为

... where table2.auditid in (14, 15)  and   ...
然后您只需要更改外部
选择中的聚合函数
——它需要是一个
,并且是一个条件和

count(table1.id)
计算非空值。我假设id不能为空,因此这与
count(*)
-或者甚至是
sum(1)
相同。这将有助于当前赋值:您需要什么而不是
sum(1)
当您想为每个
表添加1时,2.auditd=15
为每个
表减去1.auditd=14
是:

sum(decode(table2.auditid, 15, +1, 14, -1))   [as <whatever>]
sum(解码(表2.1,15,+1,14,-1))[as]

祝你好运!

-是的,我的意思是在第二个块上“文件被删除”,这只是复制时的一个错误-我刚刚修复了我的查询,它工作得很好!非常感谢!