2012-11-08 86 views
0

我對我的查詢有一個挑戰,返回多個結果。Select Statement with distinct returns multiple rows and need only first result

SELECT DISTINCT gpph.id, gpph.cname, gc2a.assetfilename, gpph.alternateURL 
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph 
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
ON gpph.id=gc2a.id 
WHERE gpph.subtype='Level_4' AND [email protected] AND gc2a.assettype='Primary Image' 

result set

A記錄,5679599,具有2 '主映像',並返回2個結果那個ID,但我只需要第一個結果返回。在當前查詢中有沒有辦法做到這一點?我是否需要編寫多個查詢?

我需要關於如何將結果限制爲主圖像上只有1個結果的一些指示。我研究了大量類似的問題,但最典型的情況是隻需要在查詢的開頭添加「distinct」而不是where子句的指導。

編輯:此問題是由用戶在數據庫中的一個記錄上輸入2個主圖像而創建的。我的業務需求僅表明採取第一個結果。

任何幫助將會很棒!

+1

如何定義'第一' - 查詢中沒有訂單,所以當找到兩條記錄時,選擇'first'的業務規則是什麼 - 基於字母順序?最近更新的日期?隨機? (任何解決方案都需要知道規則) – Andrew

+0

這並不重要。此問題由用戶在一條記錄上輸入2張主圖像而創建。我的業務需求僅表明採取第一個結果。這是否回答你的問題? –

回答

2

如果可以選擇的arbitary這回,我們就可以使用聚合的價值。這然後需要一個group by條款,從而消除了不同的需要。

SELECT gpph.id, gpph.cname, max(gc2a.assetfilename), gpph.alternateURL 
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph 
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
ON gpph.id=gc2a.id 
WHERE gpph.subtype='Level_4' AND [email protected] AND gc2a.assettype='Primary Image' 
GROUP BY gpph.id, gpph.cname, gpph.alternateURL 

在這種情況下,使用max(gc2a.assetfilename)是要給你存在多於一個記錄的情況下,按字母順序最高值。這不是理想的選擇,知道記錄順序的某種時間標記可能會更有幫助,因爲那時「第一」這個詞的含義可能更有意義。

+0

好的。我現在知道了。將來,我可以建議一個時間戳和更好的返回結果。感謝您的幫助! –

0

通過更換不同的分組:

SELECT MAX(gpph.id), gpph.cname, gc2a.assetfilename, gpph.alternateURL 
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getpimproducthierarchy] gpph 
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
ON gpph.id=gc2a.id 
WHERE gpph.subtype='Level_4' AND [email protected] AND gc2a.assettype='Primary Image' 
AND gpph.id = MAX(gpph.id) 
GROUP BY gpph.cname, gc2a.assetfilename, gpph.alternateURL 
+0

感謝您的幫助,但是我在上面的查詢中遇到了這個錯誤:「聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且聚合的列是外部參考。」 –

+0

編輯將SQL放在代碼塊中,使其更易於閱讀 - 但我認爲這不對。 where子句中的最大值必須在having子句中成爲合法語法,但它仍不能解決問題。 – Andrew

相關問題