繁体   English   中英

SQL查询不返回任何行

[英]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;

您需要从SELECTGROUP 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM