Deutsch

SQL. Кто виноват?

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

я собственно тоже не смог распознать вопроса-проблемы
этот "вот кто виноват?" или этот "люди добрые?"
id, не обратимое в нуль- это id, генерируемое аутовертом
ну его не обязательно использовать, конечно если есть острая необходимость в нуле*)
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана
#3 
Murr старожил23.06.05 01:46
Murr
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 -->
#4 
toptop постоялец23.06.05 08:53
NEW 23.06.05 08:53 
в ответ Murr 23.06.05 01:46
Сформулирую вопрос,
почему главный запрос выдает ошибку с подзапросом
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 ALL, тогда проверка дубликатов не производится, я так в конечное решение и включил.
#5 
toptop постоялец23.06.05 08:54
NEW 23.06.05 08:54 
в ответ где я? 23.06.05 00:22
В ответ на:
и вс╦ таки главное конечный результат. РАБОТАЕТ и лана

Не хотелось бы на те же грабли еще раз.
#6 
toptop постоялец23.06.05 08:59
23.06.05 08:59 
в ответ digital_pilot 22.06.05 23:43
Работать-то он работает, но только когда в подзапрос добавляешь Union Select без записи. А без Union ошибочка млин.
#7 
scorpi_ скептик23.06.05 10:50
NEW 23.06.05 10:50 
в ответ toptop 23.06.05 08:53
Select f1, f2, f3 From tab Where <...>
А можно этот запрос полностью привести? С определениями таблиц? Кстати, о какой версии Access речь?
#8 
toptop постоялец23.06.05 12:38
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 разрешен, не индексирован.

#9 
Murr старожил23.06.05 19:24
Murr
NEW 23.06.05 19:24 
в ответ 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 -->
#10