2015-10-26 38 views
1

我正在使用一些继承的代码,并且无法解决以下问题:我希望能够通过多种条件搜索我们的清单数据库,其中包括硬件序列号和有关硬件的评论。然后,我想返回符合此搜索条件的清单中的硬件清单。SQL - 在数据库中找到多个实例时返回记录的第一个实例

我遇到的问题是,对于一个硬件可能有多个注释,所以当返回硬件列表时,我看到同一件的多个结果(因为加入了Events表)。我怎样才能为每个硬件显示一次记录,而不是每个硬件的多个记录?

下面是SQL查询的片段减去所有的如果包含语句搜索参数和这样的:

SELECT 
UPPER(Hardware.HardwareSerialNumber) AS HardwareSerialNumber, 
UPPER(Hardware.HardwareName) AS HardwareName, 
Hardware.HardwareFirstDeploymentDate, 
Hardware.HardwareActive, 
Hardware.HardwareAccountNumber, 
Hardware.BillingAccountNumber, 
Hardware.LastUpdated, 
Hardware.Comments, 
Events.EventComments 
FROM 
Hardware 
LEFT JOIN 
Events 
ON 
Hardware.HardwareSerialNumber = Events.HardwareSerialNumber 
WHERE 1=1 

预先感谢您!

+1

可能重复的[检索每个组中的最后一条记录](http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) – Bulat

+2

取决于哪个'EventComment'你想展示。一个选项,删除连接并使用相关的子查询;另一种选择,聚合;另一个选项,窗口函数与子查询。取决于... – sgeddes

+0

我没有提及,我希望能够基于EventComments列进行搜索。我已经尝试了select中的子查询,并且能够为每个硬件返回一个结果,但我无法在子查询中使用搜索参数。 –

回答

2

我看了你的问题和评论几次,我想你的问题可能比我们做得更简单。这听起来像你有你想要的数据,但只是无法弄清楚如何从中挑选出子集。我建议以下方法是可能的。


集团 这是在客户端的解决方案既然你已经通过序列号,然后输出基于CFOUTPUT的GROUP PARAM你想要的数据,订购。喜欢的东西:

<cfoutput group="serialnumber"> 
.... output a line item for the hardware. 
    <cfoutput group="comments"> 
      ... line item for each comment. 
</cfoutput> 
</cfoutput> 

当然,如果你只是想展现硬件件本身,只是做外CFOUTPUT并跳过内部之一。


SELECT A Q 再次,这是一个客户端解决方案截然不同Q值。既然你有数据要运行一个单独的查询查询,并选择不同的硬件相关的行(无评论)。

<cfquery name="hardware" dbtype="query"> 
SELECT DISTINCT hardwareserialnumber, hardwarename 
FROM qryHardware 
</cfquery> 

...其中该示例中的qryHardware是上面返回的查询的名称。然后根据需要使用此子查询。


拆分查询

你可以尝试只跑2个查询,一个包含硬件和其他的评论。如果您需要针对注释进行搜索,请使用子查询来确定您应该使用哪些硬件序列,然后在第二个查询中提取注释。通常人们真的很难将所有的数据都放到一个查询中 - 这是一个难以置信的目标,并且让数据库能够做到最好,但有时候这是一种浪费。 Lineheader/lineitem或Item/comment可以是IMO的那些时间之一。

+1

马克提出了一些很好的观点。一个额外的想法是,评论不必包含在SELECT列表中以便被搜索。如果你只是想显示一个不同的匹配硬件列表,使用'WHERE EXISTS(...)'子句,而不是JOIN。 – Leigh

相关问题