2010-04-10 35 views
0

我下面的表格有更好的辦法:寫這個SQL

create table ARDebitDetail(ID_ARDebitDetail int identity, 
        ID_Hearing int, ID_AdvancedRatePlan int) 

我試圖讓根據ID_Hearing最新ID_AdvancedRatePlan。最新的意思是最大的ID_ARDebitDetail。我有這個查詢,它工作正常。

select ID_AdvancedRatePlan 
    from ARDebitDetails 
    where ID_Hearing = 135878 
    and ID_ARDebitDetail = 
      ( select max(ID_ARDebitDetail) 
       from ARDebitDetails 
       where ID_AdvancedRatePlan > 0 and ID_Hearing = 135878 
      ) 

然而,它看起來很醜,聞起來很糟糕。有沒有辦法以更簡潔的方式重寫它?

回答

2
SELECT TOP 1 ID_AdvancedRatePlan 
FROM ARDebitDetails 
WHERE ID_Hearing = 135878 
AND ID_AdvancedRatePlan > 0 
ORDER BY ID_ARDebitDetail DESC 
+0

衛生署。爲什麼我沒有想到這一點。 – AngryHacker 2010-04-10 19:06:17

2

在RDBMS中,代碼氣味很少出現在SQL文本中,代碼在您的模式中嗅覺到。舉例:在沒有正確索引的表格中搜索某些條件,這將始終導致表掃描。要獲得一個給定的ID_Hearing最後ID_AdvancedRatePlan,因此組織表:

create clustered index cdxARDebitDetail 
on ARDebitDetail (ID_Hearing, ID_ARDebitDetail DESC); 

如果更改聚集索引是不可取的,對於各種resons,應提供覆蓋非聚集索引。無論你做什麼,其要點都是你不應該每次都掃描桌子,這是部署時發生災難的祕訣。

然後你可以按照你的意願搜索,而電氣的答案是一個非常好的答案。

2

使用一個公共表表達式將是另一種解決方案:

With RankedItems 
    (
    Select ID_ARDebitDetail, ID_AdvancedRatePlan 
     , ROW_NUMBER() OVER(ORDER BY ID_ARDebitDetail DESC) As ItemRank 
    From ARDebitDetails 
    Where ID_AdvancedRatePlan > 0 
     And ID_Hearing = 135878 
    ) 
Select ID_AdvancedRatePlan 
From RankedItems 
Where ItemRank = 1