【发布时间】:2016-11-22 11:10:39
【问题描述】:
我目前正在尝试制定一个查询来确定是否在所述主机上安装了某些软件应用程序。我们在数据库中的表的设置方式是包含包含主机名和软件的列,因此例如可能有 10 条主机 A 记录,其中展示了在其上找到的 10 个单独的软件。前任。下面
ID Host SW
--------------------------
1 Host A SW A
1 Host A SW B
1 Host A SW C
2 Host B SW B
2 Host B SW C
3 Host C SW F
我要查找的是所有安装了软件 A(标志 Y/N)和软件 B(标志 Y/N)的主机,并以某种方式(使用上面的示例)格式化结果会回来...
Expected Results
Host SWA_Installed SWB_Installed
----------------------------------------------
Host A Y Y
Host B N Y
Host C N N
下面的查询是我目前所拥有的(注意实际的 DB 代码,这些是实际的 SW 名称)...
SELECT DISTINCT
HOST.a_display_label AS HOST,
CASE
WHEN
sof.a_display_label = 'HPS' THEN 'Y'
ELSE 'N'
END AS HPS_INSTALLED,
CASE
WHEN
sof.a_display_label = 'PowerToken' THEN 'Y'
ELSE 'N'
END AS PT_INSTALLED
FROM vcms.node_1 HOST
JOIN vcms.installed_software_1 sof
ON LOWER (sof.a_root_container) = LOWER (HOST.cmdb_id)
问题在于,即使它获取了 DISTINCT 结果,它仍然会返回多个主机记录,因为它上面安装的每个软件都有多个主机记录。最终结果如下所示:
Query Results
Host SWA_Installed SWB_Installed
----------------------------------------------
Host A Y N
Host A N Y
Host A N N
Host B N N
Host B N Y
Host C N N
我想知道返回“预期结果”数据需要哪些额外信息。提前谢谢你。
【问题讨论】:
-
这意味着您的源数据中有多行,而预期结果中的每一行。以
Host A为例,至少一排只有 SWA_Installed,至少一排只有 SWB_Installed,至少一排两者都没有。尝试SELECT *而不是您的查询,您应该会在数据中看到所有这些不同的组合。那么问题就变成了,如果 HostA 的某些行说“是”而某些“行”说“否”,该怎么办?是应该超越否吗?如果是这样,您需要GROUP BY Host.a_display_label和MAX(CASE blah END),而不是DISTINCT。
标签: sql oracle select join case