Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2007, 17:22   #1
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию В чем ошибка в запросе?неверный результат =(

Здравствуйте,коллеги.возникла непонятная проблема.
Задача:
есть две таблицы с наименованиями товара и некоторыми дополнительными параметрами,которые не имеют значения: t1(art varchar(30)) и t2(art2 varchar(30)).Кол-во артикулов больше в таблице t2. Однако в t1 есть такие,которых нет в t2.
Надо составить запрос на выборку тех строкиз t2,которых НЕТ в t1.C первого взгляда простейший запрос...я тоже так думал.Написал с легкой душой:
Код:
SELECT t2.art2 FROM t2 WHERE NOT t2.art2 IN(SELECT t1.art FROM t1)
Когда мне показало 0 строк,я забеспокоился и проверил без NOT.Условия выполнились замечательно.Потому вместо первого враианта я поставил конструкцию t2.art2<> ALL (...) Тоже самое...ни одной строки.
Хотя я могу 100%но сказать,что такие записи есть. Как я только не менял условия,уже тупо щелкая,ибо логика пошла к черту. Либо все записи выдавались из t2 либо 0.Я в панике.Где ошибка?Я уже через заднее место делал,выясняя,что ЕСТЬ в t1 из t2.После чего полученный набор подливал к t2 опять же и пытался выбрать записи,где не подливалось ничего(т.е. те строки,которых нет в t1).Тот же результат.Повторю,я 100%но уверен,что такие строки есть.в t1 1000 строк.Из них около 950 из t2.Но не все...учитывая,что в t2 их 3500.
и еще одно:эти две таблицы типа ##(глобальные временные)
Lunatikus вне форума Ответить с цитированием
Старый 23.11.2007, 18:52   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Первое. Оператор NOT IN возвращает результат ТОЛЬКО в том случае, если НИ ОДНО (!) из значений art2 не совпало со значениями, полученными во внутреннем запросе.
Второе. Используйте вместо NOT IN другое выражение - NOT EXISTS.
mihali4 вне форума Ответить с цитированием
Старый 26.11.2007, 09:29   #3
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию

не совсем понял,Как применить EXISTS в данном случае.В синтаксис нет упоминания о том,что можно(и главное,как можно) узнать о существовании именно таких строк как в t2.
Кстати,заметил еще один нюанс.В t1 есть еще одно поле,art3,строковое,там практически везде дублируется поле art2. Когда я выполнил:
Код:
SELECT t2.art2 FROM t2 WHERE t2.art2 NOT IN(SELECT t1.art3 FROM t1)
условия выполнились замечательно.Так что я не вижу,чтобы NOT IN обозначал полное несовпадение ни одного поля t2.art2 с результатом подзапроса.Меня нервирует то,что с другим абсолютно идентичным полем,но немного другими данными это улсовие нормально выполняется.
Таблица t1 была заполнена через INSERT INTO , где в подзапросе основным полем было art3,остальные подгружались с помощью LEFT JOIN из других таблиц.
И еще одно.В менеджере на специально созданных табличках (пробовал и с временными и с постоянными) запрос опять же выполняется замечательно. Мистика какая-то с этим полем t1.art2...
ах да,в поле t1.art2 есть пустые значения NULL, а в поле t1.art3 нет.

Последний раз редактировалось Lunatikus; 26.11.2007 в 09:42.
Lunatikus вне форума Ответить с цитированием
Старый 26.11.2007, 09:50   #4
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию

все...нашел ошибку...аллилуйя...два дня бился из-за такой дурацкой ошибки...дело-то и было в нулевых значениях t1.art2...их было несколько.Видимо,я так и не понял до конца принцип выполнения условия NOT IN.Убрав нулевые значения в подзапросе:
Код:
SELECT t2.art2 FROM t2 WHERE NOT t2.art2 IN(SELECT t1.art2 FROM t1 WHERE NOT t1.art2 is NULL)
все выполнилось отлично,проверил.Получается то,что требовалось.
Т.е. если просто:
таблица1:
поле1
А
Б
В
Г

таблица2:
поле1
А
Б
Д

Такой запрос выведет только строку Д,ибо ее нет в таблица1.Но я так и не понял,почему наличие пустого значения в таблица1 ведет к невыполнению условия.
Lunatikus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка SQL запросе. EVG44 БД в Delphi 2 21.10.2007 22:42
Ошибка при запросе SQL в IB Алекс1 БД в Delphi 2 24.06.2007 22:37
Ошибка в SQL запросе eremin БД в Delphi 2 23.06.2007 07:13
Ошибка в SQL запросе...!? KeyDok БД в Delphi 5 21.06.2007 09:19