Oracle: Как мне объединить два запроса набора результатов (на основе одной таблицы), а затем вычесть результаты? - PullRequest
0 голосов
/ 02 ноября 2018

Моя проблема

У меня есть два запроса, которые имеют одинаковый выбор и критерии, но имеют другое утверждение where. Каждый запрос подсчитывает количество «действий». Первый запрос подсчитывает все созданные файлы, а второй - все удаленные файлы. Чтобы получить обновленное количество файлов, мне нужно объединить их, а затем вычесть количество результирующих наборов для удаленных из числа результирующих наборов для созданных.

Вот мои два запроса. Они практически одинаковы, за исключением того, что для одного из них table2.auditid = 15 для созданного, а для другого table2.auditid = 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

Обратите внимание, что эти запросы выполняются самостоятельно.


Что я пробовал

  • Я не могу использовать оператор минус, так как он не работает для наборов результатов (я забыл об этом и задавал этот вопрос ранее)
  • Я пытался вложить эти два запроса в подзапросы и использовать объединение и т. Д., Но не смог заставить его работать.
  • Я пробовал метод, описанный в ( SQL сумма 2 другой столбец с другим условием, чем вычитание и добавить ). Это дало мне ошибку 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

Кто-нибудь может дать некоторое представление?

1 Ответ

0 голосов
/ 02 ноября 2018

В вашем блоке запросов «Удалено» вы все еще даете имя столбцу "Files Created" в списке SELECT; Я предполагаю, что это ошибка, она должна быть "Files Deleted", верно?

Чтобы ответить на ваш вопрос: похоже, вы распознаете файлы, которые «созданы», а не «удалены» по атрибуту table2.auditid, верно? 15 для созданных, 14 для удаленных?

Чтобы захватить оба в одном запросе, эта часть последней группы where условий должна стать

... where table2.auditid in (14, 15)  and   ...

Тогда вам нужно всего лишь изменить агрегатную функцию во внешнем select - это должна быть sum и условная сумма при этом.

count(table1.id) считает ненулевые значения. Я предполагаю, что идентификатор не может быть нулевым, так что это то же самое, что и count(*) - или даже sum(1). Это поможет с текущим назначением: то, что вам нужно вместо sum(1), когда вы хотите добавить 1 для каждого table2.auditid = 15, но вычитать 1 для каждого table2.auditid = 14:

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...