Логика запроса на нумерацию строк.
Kvasnikov
Дата: 26.02.2008 16:37:16
Не могу разобраться с логикой запроса, который нумерует строчки
SELECT DISTINCT Numeration(NAME) AS Num, MyQuery.NAME
FROM MyQuery
WHERE (((Numeration())=0));
Public Function Numeration(Optional var) As Long
Static n As Long
If IsMissing(var) Then
n = 0
Else
n = n + 1
End If
Numeration = n
End Function
Каким образом он обнуляет «n» и почему, если убрать «WHERE (((Numeration())=0));», то в каждом новом запросе нумерация продолжается от предыдущего запроса.
Объясните, плиз, по шагам, как для маленьких. Спасибо.
Polev
Дата: 26.02.2008 16:45:35
Kvasnikov |
Не могу разобраться с логикой запроса, который нумерует строчки
SELECT DISTINCT Numeration(NAME) AS Num, MyQuery.NAME FROM MyQuery WHERE (((Numeration())=0));
Public Function Numeration(Optional var) As Long Static n As Long If IsMissing(var) Then n = 0 Else n = n + 1 End If Numeration = n End Function
Каким образом он обнуляет «n» и почему, если убрать «WHERE (((Numeration())=0));», то в каждом новом запросе нумерация продолжается от предыдущего запроса.
Объясните, плиз, по шагам, как для маленьких. Спасибо. |
Сначала вычисляется условие WHERE (((Numeration())=0));
При обращение к функции Numeration с пустым аргументом переменной n присваивается значение 0
Далее поочередно каждая строка обращается к этой функции с непустым аргументом.
И n при каждом обращении увеличивается на 1.
Владимир Саныч
Дата: 26.02.2008 16:45:50
Если убрать обнуление, то обнулять не будет... Логично.
Посмотрите в приведенной Вами функции, что она делает, когда к ней обращаются без параметра. Она делает n = 0.
Осталось только добавить, что WHERE выполняется раньше, чем остальные части запроса.
TungusXan
Дата: 26.02.2008 16:47:01
SELECT DISTINCT Numeration(NAME) AS Num 'вызов собсно процедуры чтоб номер был рез запроса
, MyQuery.NAME
FROM MyQuery
WHERE (((Numeration())=0));для пустого имени(дорлжно вроде послединим быть) обнуляем счётчик
Public Function Numeration(Optional var) As Long 'собсно процедура
Static n As Long
If IsMissing(var) Then 'если процедура с пустым параметром обнуляем счётчик
n = 0
Else 'иначе прибавляем единицу
n = n + 1
End If
Numeration = n 'выдаём результат "нагора"
End Function
Вроде так!:)
TungusXan
Дата: 26.02.2008 16:48:19
С обнулением промахнулся:( Но расписал подробнее:)
Kvasnikov
Дата: 26.02.2008 17:26:50
Большое спасибо.
Думал, что запрос для каждой строчки выполняется заново, не знал, что WHERE выполняется только раз в начале.
Только мне не совсем понятно, как он может выполнятся только один раз. Допустим, есть таблица сотрудников и надо выбрать всех с именем «Дима»
SELECT Workers.Name FROM Workers WHERE Workers.Name=”Дима”
Я так понимаю, что запрос должен пройтись по всей таблице и в каждом проверить поле Name, то есть WHERE должно выполнятся столько раз, сколько записей в таблице.
Владимир Саныч
Дата: 26.02.2008 17:30:41
Из WHERE выполняется в самом начале то, что можно. Например, если там написано "Ди" & "ма", то один раз будет вычислено, что вместе получается "Дима", а потом, конечно, каждая строчка будет сравниваться с этим значением. А в Вашем примере вообще поля в условие не входят, значит оно полностью может быть вычислено заранее.
Kvasnikov
Дата: 26.02.2008 17:41:30
Извините за дубль, хотел еще раз сказать Спасибо.
Владимир Саныч
Дата: 26.02.2008 18:25:21
Кстати, не только в WHERE, но и в списке полей если есть выражение, которое не включает в себя поля, то оно будет вычислено один раз. Поэтому в Вашем же примере второе обращение к Numeration идет с параметром, чтобы функция выполнялась каждый раз. Заметьте, что сам параметр внутри функции не используется.