SQL Server: запрашивает следующее наименьшее значение для данного параметра

#sql #sql-server-2000

#sql #sql-server-2000

Вопрос:

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

 GroupID Sequence    Name
1             10        Mary
1             25        Jack
1             17        Jill
2              3        Peter
2             42        Henry
2             50        Paul
  

Следующий запрос возвращает строку со следующей наименьшей последовательностью (10) для данной группы (1) и заданной последовательностью из 17

 SELECT TOP 1 *
FROM   dbo.customerassignmentgroup
WHERE  groupid = 1
       AND SEQUENCE < (SELECT MAX(SEQUENCE)
                       FROM   dbo.customerassignmentgroup i
                       WHERE  i.groupid = customerassignmentgroup .groupid)
       AND manualsequence < 17
ORDER  BY SEQUENCE DESC
  

Есть ли другой способ сделать это? Я пытаюсь избежать

ГДЕ i.groupid = customerassignmentgroup .groupid

во внутреннем запросе, потому что мне нужно преобразовать это в запрос на дозвуковом

Примечание: Моей базой данных является SQL Server 2000

Комментарии:

1. можете ли вы использовать хранимую процедуру?

2. Я пытался избежать этого … похоже, я мог бы в конечном итоге использовать его.

Ответ №1:

Если вы используете ORDER BY, как вы делаете, вы могли бы просто сделать:

 SELECT TOP 1 *
FROM   dbo.customerassignmentgroup
WHERE  groupid = 1 AND SEQUENCE < 17
ORDER  BY SEQUENCE DESC
  

Вы могли бы избежать использования сортировки, выполнив:

 SELECT *
FROM   dbo.customerassignmentgroup t1
WHERE  t1.groupid = 1
   AND t1.SEQUENCE = (SELECT MAX(t2.SEQUENCE)
                   FROM   dbo.customerassignmentgroup t2
                   WHERE  t2.groupid = 1 AND t2.SEQUENCE < 17)
  

Ответ №2:

Есть другой способ сделать это, но я понятия не имею, помогает ли это с SubSonic. В основном перемещает подзапрос в FROM .

 SELECT TOP 1 *
FROM   dbo.customerassignmentgroup i
       INNER JOIN (SELECT MAX(SEQUENCE) SEQUENCE, groupid
                       FROM   dbo.customerassignmentgroup
                       GROUP BY groupid) maxSeq
       ON  i.groupid = maxSeq.groupid
          and i.SEQUENCE < maxSeq.SEQUENCE 
          and i.groupid = maxSeq.groupid

WHERE  groupid = 1

       AND manualsequence < 17
ORDER  BY SEQUENCE DESC