[英]SQL Query returns no rows
我正在查询以获取所有已安装多个防病毒软件的计算机的列表。 不幸的是,我无法获得查询以返回任何内容。 正如您在下面的屏幕快照中看到的那样,我已经设置了数据,以便在查询正常工作时它的结果集将包含设备1、2和3上的数据。
这是我目前所拥有的:
SELECT d.ip_address AS "IP Address",
d.name AS "Computer Name",
av.name AS "Antivirus Name",
COUNT(av.deviceID) AS "# of AV Installed"
FROM devices d JOIN anti_virus_products av
ON d.deviceID = av.deviceID
GROUP BY d.ip_address, d.name, av.name
HAVING COUNT(av.deviceID) > 1;
您需要从SELECT
和GROUP BY
删除防病毒名称av.name
。 通过在结果中包括这些值, GROUP BY
将为每台计算机和防病毒名称创建一个新行-因为这些值将创建一个唯一的组。
SELECT d.ip_address AS "IP Address",
d.name AS "Computer Name",
COUNT(av.deviceID) AS "# of AV Installed"
FROM devices d JOIN anti_virus_products av
ON d.deviceID = av.deviceID
GROUP BY d.ip_address, d.name
HAVING COUNT(av.deviceID) > 1;
根据注释进行更新,以扩展查询以列出设备上安装的所有AV软件的名称:
您可以对COUNT
函数进行分区。 为此,我找不到指向Oracle文档的链接,但是OVER子句的SQL Server语法似乎可以与Oracle一起使用。 在SQL Fiddle上查看此示例查询
SELECT d.ip_address AS "IP Address",
d.name AS "Computer Name",
d.deviceid,
av.name AS "Antivirus Name",
COUNT(*) OVER (PARTITION BY d.ip_address, d.name) AS "Total # of AV Installed"
FROM devices d JOIN anti_virus_products av
ON d.deviceID = av.deviceID
GROUP BY d.ip_address, d.name, d.deviceid, av.name;
此示例查询将为每个设备和防病毒对返回一行,并包括设备上安装的AV总数。
我不确定这是否可以解决您的问题,但是它提供了您正在寻找的其他数据。
只需从group by
子句中删除av.name
。 您的查询返回的计算机多次安装了相同的防病毒软件,这种情况不太可能发生:
SELECT d.ip_address AS "IP Address",
d.name AS "Computer Name",
COUNT(av.deviceID) AS "# of AV Installed"
FROM devices d JOIN
anti_virus_products av
ON d.deviceID = av.deviceID
GROUP BY d.ip_address, d.name
HAVING COUNT(av.deviceID) > 1;
如果要将防病毒软件的名称放在一行上,则可以使用listagg()
。 这是listagg的Oracle文档页面: http ://docs.oracle.com/cd/E11882_01/server.112/e26088/functions089.htm#SQLRF30030
正如其他人所说,由于每个所需的组有多个AV名称,因此查询无法按AV名称分组。 此查询将返回以逗号分隔的每台计算机的AV名称列表以及计数:
SELECT d.ip_address AS "IP Address",
d.name AS "Computer Name",
(select name + ',' from anti_virus_products where deviceid = d.deviceid for xml path('')) AS "Antivirus Name",
avc."# of AV Installed"
FROM devices d
JOIN (select deviceid,count(*) AS "# of AV Installed" from anti_virus_products
group by deviceid having count(*) > 1) avc
ON d.deviceID = avc.deviceID
如果不需要反病毒名称,请从查询中删除。 如果这样做,您将在查询中的某个地方使用它。 我让你弄清楚哪里。
and device.deviceid in
(select deviceid
from
(select deviceid, count(*) records
from anti_virus_products
group by device_id
having count(*) > 1) temp
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.