2010-04-10 2 views
0

У меня есть следующая таблица:Лучший способ, чтобы написать этот SQL

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

Я пытаюсь получить последнюю ID_AdvancedRatePlan основанную на ID_Hearing. К последнему я имею в виду самый большой 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

2

В РСУБД запах кода редко встречается в тексте SQL, код запах в вашей схеме. Пример: поиск некоторого условия в таблице без надлежащего индекса, что всегда приведет к сканированию таблицы. Чтобы получить последнюю ID_AdvancedRatePlan для данного ID_Hearing, организовать таблицу соответственно:

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