Вход на сайт
SQL. Кто виноват?
193
NEW 22.06.05 15:37
Ситуация такова:
Жил да был в Access, один сложный запрос, который состоял из многих подзапросов, а те в свою очередь тоже. Жили они дружно, связанные кто через Outer Join, кто через Inner, пока злой пользователь в одном простом подзапросе на основе одной таблицы не нашел ошибку.
Состояла та ошибка исключительно в неправильной формулировке WHERE. Поменял добрый молодец эту where на правильную, но обругал его главный запрос страшными словами: Dieser Ausdruck wurde falsch eingegeben, oder er ist zu komplex, um ausgewertet zu werden. Почесал добрый молодец свою тыковку, да делать нечего - надо дальше править. Присоединил добрый молодец к исправленному подзапросу через UNION те записи, которые раньше неправильный WHERE выдавал, а теперь правильный не выдает, примерно так:
Select f1, f2, f3 From tab Where <...>
Union Select f1, f2, f3 From Tab where Id in (1,5,7,9)
Заработал главный запрос, но невесело добру молодцу. Начал он Id записей поочередно из In списка выкидывать, что б найти, кто виноват и что делать. Да так все и по выкидывал, что ни одной не осталось:
Select f1, f2, f3 From tab Where <...>
Union Select f1, f2, f3 From Tab where Id = 0
А Id - то никогда в нуль и не обратится. А главный запрос работает себе и работает.
А добрый молодец сидит пригорюнившись и думу думает. Что делать-то, он нашел, а вот кто виноват?
Решил он тогда народ поспрошать, может знает кто чего или слыхал об чем-то этаком. А, люди добрые?
Жил да был в Access, один сложный запрос, который состоял из многих подзапросов, а те в свою очередь тоже. Жили они дружно, связанные кто через Outer Join, кто через Inner, пока злой пользователь в одном простом подзапросе на основе одной таблицы не нашел ошибку.
Состояла та ошибка исключительно в неправильной формулировке WHERE. Поменял добрый молодец эту where на правильную, но обругал его главный запрос страшными словами: Dieser Ausdruck wurde falsch eingegeben, oder er ist zu komplex, um ausgewertet zu werden. Почесал добрый молодец свою тыковку, да делать нечего - надо дальше править. Присоединил добрый молодец к исправленному подзапросу через UNION те записи, которые раньше неправильный WHERE выдавал, а теперь правильный не выдает, примерно так:
Select f1, f2, f3 From tab Where <...>
Union Select f1, f2, f3 From Tab where Id in (1,5,7,9)
Заработал главный запрос, но невесело добру молодцу. Начал он Id записей поочередно из In списка выкидывать, что б найти, кто виноват и что делать. Да так все и по выкидывал, что ни одной не осталось:
Select f1, f2, f3 From tab Where <...>
Union Select f1, f2, f3 From Tab where Id = 0
А Id - то никогда в нуль и не обратится. А главный запрос работает себе и работает.
А добрый молодец сидит пригорюнившись и думу думает. Что делать-то, он нашел, а вот кто виноват?
Решил он тогда народ поспрошать, может знает кто чего или слыхал об чем-то этаком. А, люди добрые?
NEW 23.06.05 00:22 
я собственно тоже не смог распознать вопроса-проблемы
этот "вот кто виноват?" или этот "люди добрые?"
id, не обратимое в нуль- это id, генерируемое аутовертом
ну его не обязательно использовать, конечно если есть острая необходимость в нуле*)
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана
в ответ toptop 22.06.05 15:37

я собственно тоже не смог распознать вопроса-проблемы
этот "вот кто виноват?" или этот "люди добрые?"

id, не обратимое в нуль- это id, генерируемое аутовертом
ну его не обязательно использовать, конечно если есть острая необходимость в нуле*)
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана

NEW 23.06.05 01:46
в ответ toptop 22.06.05 15:37
Select f1, f2, f3 From tab Where <...>
Union
Select f1, f2, f3 From Tab where Id in (0)
-----
А что за проблема то?
По коду - первый Селект строит временный набор из трех полей по условию <...>. Второй в него ничего не добавляет. Форматы совпадают так что ругани не будет.
Хммм... Припоминается что-то такое... Вроде как при UNION Аккцесс не может повторно пометить выбранные первым Селектом записи... В результате дублирующиеся строки не добавляются второй раз в конечную выборку... Обходится путем множественного INSERT INTO в промежуточную таблицу и селектом Join на нее.
Я бы еще посмотрел, не случилось ли такого, как наличие двух таблиц 'tab' & 'Tab'... Это же Аккцесс все же...
<--- nobody harmed in this action -->
Union
Select f1, f2, f3 From Tab where Id in (0)
-----
А что за проблема то?
По коду - первый Селект строит временный набор из трех полей по условию <...>. Второй в него ничего не добавляет. Форматы совпадают так что ругани не будет.
Хммм... Припоминается что-то такое... Вроде как при UNION Аккцесс не может повторно пометить выбранные первым Селектом записи... В результате дублирующиеся строки не добавляются второй раз в конечную выборку... Обходится путем множественного INSERT INTO в промежуточную таблицу и селектом Join на нее.

Я бы еще посмотрел, не случилось ли такого, как наличие двух таблиц 'tab' & 'Tab'... Это же Аккцесс все же...

<--- nobody harmed in this action -->
NEW 23.06.05 08:53
в ответ Murr 23.06.05 01:46
Сформулирую вопрос,
почему главный запрос выдает ошибку с подзапросом
Проще UNION ALL, тогда проверка дубликатов не производится, я так в конечное решение и включил.
почему главный запрос выдает ошибку с подзапросом
Select f1, f2, f3 From tab Where <...>
и не выдает с подзапросом
Select f1, f2, f3 From tab Where <...>
Union
Select f1, f2, f3 From Tab where Id in (0)
?
Оба приведенных запроса выдают идентичные результаты, так как Id = 0 в таблице нет и не будет.
...
tab и Tab описка. К тому же Access к этому не чувствителен.
???
Хочется разумного или логичного объяснения.
В ответ на:
Вроде как при UNION Аккцесс не может повторно пометить выбранные первым Селектом записи... В результате дублирующиеся строки не добавляются второй раз в конечную выборку... Обходится путем множественного INSERT INTO в промежуточную таблицу и селектом Join на нее.
Вроде как при UNION Аккцесс не может повторно пометить выбранные первым Селектом записи... В результате дублирующиеся строки не добавляются второй раз в конечную выборку... Обходится путем множественного INSERT INTO в промежуточную таблицу и селектом Join на нее.
Проще UNION ALL, тогда проверка дубликатов не производится, я так в конечное решение и включил.
NEW 23.06.05 12:38
в ответ scorpi_ 23.06.05 10:50
Access 97, 2000. Предположительно 2002.
а запрос как запрос.
а запрос как запрос.
SELECT F1, F2, F3
FROM Tab
WHERE (Not F2 Is NULL And F2<=[Stichtag]) AND (F3 Is Null Or F3>=[Stichtag],0);
F1 - Long Integer, ключ из главной таблицы, NULL не разрешен. Индекс - по возрастанию.
F2 - Дата начала, NULL разрешен, не индексирован.
F3 - Дата окончания, NULL разрешен, не индексирован.