我之前已经问过这个问题,但是我没能看到任何适合我情况的解决方案。典型的SQL语句如下所示:
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%$hostval%'
$ hostval是一个powershell变量,它被系统名称替换。因此,如果我有一个名为OldGlory117的系统,则该语句将如下所示:
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%OldGlory117%'
由于其他列,某些行是重复的,并且数据库中存在重复的主机名。所以上面的查询可能会返回:
OldGlory117 USA Rack1
OldGlory117 USA Rack1
OldGlory117 USA Rack1
当我没有找到导致重复的列时,这是有问题的。有没有办法只返回具有hostname唯一值的行?如果我没有在WHERE语句中指定主机名怎么办?例如:
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%'
谢谢!
答案 0 :(得分:2)
您是否可以使用GROUP BY?
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%' GROUP BY Hostname
答案 1 :(得分:1)
试试这个:
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%' having count(Hostname)=1 GROUP BY Hostname,Site,Rack
编辑: having子句将帮助您按条件
设置条件答案 2 :(得分:1)
以下代码将为您完成这项工作:
SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%$hostval%'
GROUP BY Hostname, Site, Rack
您也可以尝试使用SELECT DISTINCT
关键短语,但如果您之前没有使用它,可能会产生意外结果......
答案 3 :(得分:1)
根据我的理解,您可以在使用DISTINCT后实现您的目标(只要所有三列都与样本数据中的不同,就可以正常工作)。
SELECT DISTINCT Hostname,Site,Rack
FROM hardwaredb
WHERE Rack LIKE '%Rack1%'
如果Site和Rack中的值不同,那么您可以使用:
SELECT DISTINCT Hostname
FROM hardwaredb
WHERE Rack LIKE '%Rack1%'
最后,如果您在站点和机架中的值不同,但是您需要使用这些列中的每个值的值(排序依据很重要,否则查询变得不确定,并且在查询相同数据时可能会产生不同的结果) :
SELECT HostName, Site, Rack
FROM hardwaredb
WHERE Rack LIKE '%Rack1%'
GROUP BY HostName
ORDER BY Rack, Site;
但是,我个人不喜欢这个解决方案,它在大多数DBMS中都不起作用,并打破了ANSI标准,包括选择列表中不依赖于组中项目的列。虽然很难发布替代方案,但却没有理解你的确切要求。