oracle - 合并多个选择查询并添加默认值
问题描述
我正在使用多项选择来获取策略在过去 10 分钟内生成的证书。如果尚未颁发证书,则仍列出默认值为 0 的策略。如果该策略有证书问题,则显示使用该策略颁发的证书数量。
使用此查询收集策略 ID
SELECT POLICY_ID FROM POLICY_DOMAIN_PATH_MAP_TBL
MINUS
SELECT POLICY_ID FROM POLICY_DOMAIN_PATH_MAP_TBL WHERE ACTION=1 AND PATH_ID IN (-4,-2)
那么这将计算每个策略生成的证书。
SELECT
"A3"."POLICY_NAME"
count(*)
FROM
"POLICY_TBL" "A3",
"CERTIFICATE_TBL" "A2",
"CERT_STATUS_CHECK_TBL" "A1"
WHERE
"A2"."POLICY_ID" = "A3"."POLICY_ID"
AND "A2"."ISSUE_DATE" >= sysdate - 10/1440
AND "A1"."CERT_SERIAL_NUM" = "A2"."CERT_SERIAL_NUM"
AND "A1"."STATUS" = '0'
GROUP BY
"A3"."POLICY_NAME"
问题是这个最新的查询只列出了生成证书的策略,但我需要在第一个查询中列出所有策略。如果没有颁发证书,则默认为 0 如果生成了证书,则显示计数。如何调整 where 子句,以便它在第一个查询中搜索策略 id 侦听,如果没有为该策略 id 找到零结果,则添加默认值。
解决方案
您的查询中缺少某些内容 - 我没有看到 A3 的连接谓词。它应该是类似的东西AND A2.POLICY_ID = A3.POLICY_ID
。
无论如何,您只需在此处添加外部联接:
SELECT
"A3"."POLICY_NAME"
count("A1"."CERT_SERIAL_NUM")
FROM
"POLICY_TBL" "A3",
"CERTIFICATE_TBL" "A2",
"CERT_STATUS_CHECK_TBL" "A1"
WHERE
"A3"."POLICY_ID" = ???
AND "A3"."POLICY_ID" = "A2"."POLICY_ID"(+)
AND "A2"."ISSUE_DATE"(+) >= sysdate - 10/1440
AND "A1"."CERT_SERIAL_NUM"(+) = "A2"."CERT_SERIAL_NUM"
AND "A1"."STATUS"(+) = '0'
GROUP BY
"A3"."POLICY_NAME"
或在 ANSI:
SELECT
"A3"."POLICY_NAME"
count("A1"."CERT_SERIAL_NUM")
FROM
"POLICY_TBL" "A3"
left join "CERTIFICATE_TBL" "A2"
on "A3"."POLICY_ID" = "A2"."POLICY_ID"
and "A2"."ISSUE_DATE" >= sysdate - 10/1440
left join "CERT_STATUS_CHECK_TBL" "A1"
on "A1"."CERT_SERIAL_NUM" = "A2"."CERT_SERIAL_NUM"
AND "A1"."STATUS" = '0'
WHERE
"A3"."POLICY_ID" = ???
GROUP BY
"A3"."POLICY_NAME"
更新: 啊,您更改了问题中的查询。以前它包含一个由policy_id 表示的谓词。既然你不需要它,你需要加入你的结果:
SELECT
"A3"."POLICY_NAME"
count("A1"."CERT_SERIAL_NUM")
FROM
(
SELECT POLICY_ID FROM POLICY_DOMAIN_PATH_MAP_TBL
MINUS
SELECT POLICY_ID FROM POLICY_DOMAIN_PATH_MAP_TBL WHERE ACTION=1 AND PATH_ID IN (-4,-2)
) A0
join "POLICY_TBL" "A3"
on A0.POLICY_ID = "A3"."POLICY_ID"
left join "CERTIFICATE_TBL" "A2"
on "A3"."POLICY_ID" = "A2"."POLICY_ID"
and "A2"."ISSUE_DATE" >= sysdate - 10/1440
left join "CERT_STATUS_CHECK_TBL" "A1"
on "A1"."CERT_SERIAL_NUM" = "A2"."CERT_SERIAL_NUM"
AND "A1"."STATUS" = '0'
GROUP BY
"A3"."POLICY_NAME"
推荐阅读
- numpy - 我需要找到峰的坐标并划定它们的边界(即峰 1 开始于时间 65 并结束于时间 71)
- c++ - C++20 是否改变了自定义点的编写方式?
- bash - 为什么内容在 bash 中被 mv'd 后仍被添加到文件中?
- matlab - 如何在 MATLAB 中找到最小二乘成本函数的矩阵值?
- javascript - onclick 设置输入所需的属性
- java - 带有 CONCAT_WS 函数的 JPA CriteriaBuilder 抛出 NullPointerException
- python - sklearn.preprocessing.StandardScaler ValueError: Expected 2D array, got 1D array instead
- python - 当时间戳是索引时,如何获取 groupby.agg 函数的间隔开始和结束?
- python - 如何获得一块 Python Pandas .loc 行来引用原始数据框,而不是依次运行?
- reactjs - 当状态是数据库表时,如何从子级更改父级的状态?