2015-10-26 35 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

相關問題