ник: АлексейЕ
Пусть я и Опаздун, но задел меня вопрос твой, Олег. Решил поразбираться и понять, как эти запросы в Access работают.
Может, кому и пригодится.
Для начала, если твой запрос привести к такому виду,
UPDATE (
SELECT ostmp_tblObject.typeError,
ostmp_tblObject.URN
FROM ostmp_tblObject
WHERE checkURN([URN])=False
) AS s1
SET s1.typeError = "URN IS INVALID"
WHERE (nz([URN],"")<>"") ;
|
То, как ни странно, он отработает, так как ты хочешь. (теоретически, т.к. я тестил на другой таблице)
Подключил недокументированную фичу от Microsoft – запись в текстовой файл плана выполнения запроса Jet'ом.
Подергался и вот мои выводы.
1. Если обращение идет, в итоге, к одной и той же таблице, что у основного запроса, что и у вложенного, то Jet приведет такой запрос к запросу без вложенного, т.е. сделает общий Where, что б не шерстить основную таблицу, а затем выборку. Одним махом так, шмяк и выполнил.
Но этот общий Where он формирует таким образом, сначала условие основного запроса And условие вложенного.
Оказалось, так же, что у Jet'а куча комплексов (совсем как у людей).
а) Он «боится» знака неравно '<>', если он встречает такой оператор, то он его переделает в '=' и перед поставит NOT (Но оно наверно и логично, хотя…)
б) Он ненавидит True. Опять же, если встречает, то все сделает, что бы было сравнение с 0. Видимо это связано с тем, что в MS SQL True = 1. Вот, что бы не заморачиваться определением кто представляет данные он с 0 и сравнивает всегда
И так, в твоем варианте, Олег, Jet, по идее, должен сделать такое условие.
"checkURN([URN])= 0 And Not nz([URN],"")=""" (шерстит все строки и [URN] пустое)
В варианте же, который я указал, получим такой план
" Not nz([URN],"")="" And checkURN([URN])=0" (то что нужно)
2. Казалось бы, это противоречит тому, что написал Лукас... Так вот нет, ни капельки. Ведь я выше продемонстрировал, в каком порядке Jet проверяет условие у себя, в нутрях, а не как отображает нам в окне построения запросов.
Если так же просмотреть в плане выполнения запросы Лукаса, то окажется, что Jet его перевернет с ног на голову.
Т.е. в построителе запросов
WHERE checkURN([URN])=False AND Len([URN] & "")>0 )
В плане запросов, что типа
Restrict rows of table Таблица by scanning testing expression "Not Len([URN] & "")=0 And checkURN([URN])=0"
Одного я не понял, если он объединяет в единое условие, и объединяет с помощью AND , то, по идее, согласно человеческой логике, независимо от места положения функции checkURN () она должна отрабатывать всегда… Почему не отрабатывает?
Загадка.