Лучший способ написать этот SQL - PullRequest
0 голосов
/ 10 апреля 2010

У меня есть следующая таблица:

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
            )

Тем не менее, это выглядит ужасно и пахнет плохо. Есть ли способ переписать его в более сжатой форме?

Ответы [ 3 ]

2 голосов
/ 10 апреля 2010

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

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

Если изменение кластеризованного индекса нежелательно, для различных областей следует предусмотреть закрывающий некластеризованный индекс. Что бы вы ни делали, суть в том, что вы не должны сканировать таблицу каждый раз, это и есть рецепт катастрофы при развертывании.

Тогда вы можете искать, как хотите, и ответ Electric - очень хороший ответ.

2 голосов
/ 10 апреля 2010

Другое решение, использующее общее табличное выражение:

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
2 голосов
/ 10 апреля 2010
SELECT TOP 1 ID_AdvancedRatePlan
FROM ARDebitDetails
WHERE ID_Hearing = 135878
AND ID_AdvancedRatePlan > 0
ORDER BY ID_ARDebitDetail DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...