Sql Oracle:如何连接两个结果集查询(基于同一个表),然后减去结果?
我的问题 我有两个查询具有相同的select和from条件,但具有不同的where语句。每个查询统计“操作”的数量。第一个查询统计创建的所有文件,而另一个查询统计已删除的所有文件。要获得更新的文件计数,我需要将它们合并,然后从created的结果集计数中减去deleted的结果集计数 以下是我的两个问题。它们基本相同,只是其中一个创建了table2.Audited=15,另一个删除了table2.Audited=14 创建:Sql Oracle:如何连接两个结果集查询(基于同一个表),然后减去结果?,sql,oracle,Sql,Oracle,我的问题 我有两个查询具有相同的select和from条件,但具有不同的where语句。每个查询统计“操作”的数量。第一个查询统计创建的所有文件,而另一个查询统计已删除的所有文件。要获得更新的文件计数,我需要将它们合并,然后从created的结果集计数中减去deleted的结果集计数 以下是我的两个问题。它们基本相同,只是其中一个创建了table2.Audited=15,另一个删除了table2.Audited=14 创建: SELECT decode(table1.id, 2984, 'Cat
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]
祝你好运!-是的,我的意思是在第二个块上“文件被删除”,这只是复制时的一个错误-我刚刚修复了我的查询,它工作得很好!非常感谢!