Login
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 22.06.05 23:43
in Antwort toptop 22.06.05 15:37
че-т не совсем понятно из описания: главный запрос вроде правильно работает, че его мучать почем зря?
или я че-то недопонял?
--------------
Авиатор х#ев
(Старший Ассенизатор Мюнхенского Аэропорта им. Франца Йозефа Штрауса)

--------------
Авиатор х#ев
(Старший Ассенизатор Мюнхенского Аэропорта им. Франца Йозефа Штрауса)
NEW 23.06.05 00:22 
я собственно тоже не смог распознать вопроса-проблемы
этот "вот кто виноват?" или этот "люди добрые?"
id, не обратимое в нуль- это id, генерируемое аутовертом
ну его не обязательно использовать, конечно если есть острая необходимость в нуле*)
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана
in Antwort toptop 22.06.05 15:37

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

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

NEW 23.06.05 01:46
in Antwort 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
in Antwort 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 08:54
Не хотелось бы на те же грабли еще раз.
in Antwort где я? 23.06.05 00:22
В ответ на:
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана
Не хотелось бы на те же грабли еще раз.

NEW 23.06.05 08:59
in Antwort digital_pilot 22.06.05 23:43
Работать-то он работает, но только когда в подзапрос добавляешь Union Select без записи. А без Union ошибочка млин.
23.06.05 10:50
in Antwort toptop 23.06.05 08:53
Select f1, f2, f3 From tab Where <...>
А можно этот запрос полностью привести? С определениями таблиц? Кстати, о какой версии Access речь?
А можно этот запрос полностью привести? С определениями таблиц? Кстати, о какой версии Access речь?
NEW 23.06.05 12:38
in Antwort 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 разрешен, не индексирован.
NEW 23.06.05 19:24
in Antwort toptop 23.06.05 12:38
SELECT Table2.Ids, Table2.F2, Table2.F3
FROM Table2
WHERE (
((Not( F2 Is NULL))
And (F2 <= #10/03/2003#))
AND ((F3 Is Null)
Or (F3>=#15/03/2003#)),0);
Никаких ошибок...
Access 2000 СП-1
<--- nobody harmed in this action -->
FROM Table2
WHERE (
((Not( F2 Is NULL))
And (F2 <= #10/03/2003#))
AND ((F3 Is Null)
Or (F3>=#15/03/2003#)),0);
Никаких ошибок...

<--- nobody harmed in this action -->