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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2011, 17:50   #1
Hant111
Пользователь
 
Регистрация: 21.03.2010
Сообщений: 12
По умолчанию Странная работа "Not In"

Доброго времени суток.

Столкнулся с непониманием работы оператора NOT IN.
Итак Sybase, Transact SQL.
Тип данных number - numeric(15,0)

Допустим у нас есть таблицы:

1) tFirstTable
==============
id | number | info |
==============

2) tSecondTable
============
| number |
============

3) tFirdTable
============
| id | date |
============

Следующий запрос заносит во временную таблицу все из первой таблицы, при совпадении number из первой и второй таблицы.
Код:
insert into #tTimeTable
select tf.id
         tf.number
         tf.info
from   tFirstTable      tf (index tralala),
         tSecondTable  ts (index tralalala),
         tFirdTable       tfi (index tralalalala)
where tfi.Date between @datestart and @dateend
   and tfi.id = tf.id 
   and tf.number = ts.number

Допустим необходимо занести во временную таблицу все записи из первой таблицы, кроме тех, для которых ts.number = tf.number.

1) Допустим записей мало, и их можно просто перечислить списком:
Код:
insert into #tTimeTable
select tf.id
         tf.number
         tf.info
from   tFirstTable      tf (index tralala),
         tFirdTable       tfi (index tralalalala)
where tfi.Date between @datestart and @dateend
   and tfi.id = tf.id 
   and tf.number not in (1112223334445,
                                 1112223334446,
                                 2223377788855,
                                 8884445566611)
Этот запрос отрабатывает некорректно.

2) Пробовал через селект второй таблицы:
Код:
insert into #tTimeTable
select tf.id
         tf.number
         tf.info
from   tFirstTable      tf (index tralala),
         tSecondTable  ts (index tralalala),
         tFirdTable       tfi (index tralalalala)
where tfi.Date between @datestart and @dateend
   and tfi.id = tf.id 
   and tf.number not in (select tSecondTable.number from tSecondTable)
Этот запрос отрабатывает некорректно.

3) Пробовал через "and" по одной записи.
Код:
insert into #tTimeTable
select tf.id
         tf.number
         tf.info
from   tFirstTable      tf (index tralala),
         tFirdTable       tfi (index tralalalala)
where tfi.Date between @datestart and @dateend
   and tfi.id = tf.id 
   and tf.number <> 1112223334445
   and tf.number <> 1112223334446
   and tf.number <> 2223377788855
   and tf.number <> 8884445566611
Этот запрос отрабатывает некорректно.

В чем причина?

Последний раз редактировалось Stilet; 22.10.2011 в 21:27.
Hant111 вне форума Ответить с цитированием
Старый 22.10.2011, 18:17   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем tSecondTable есть во всех запросах и нигде во WHERE нет упоминания этой таблицы?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.10.2011, 18:44   #3
Hant111
Пользователь
 
Регистрация: 21.03.2010
Сообщений: 12
По умолчанию

Исправил.

В данной таблице хранится список number-ов, на схожесть/не схожесть с которыми я проверяю.

В первом запросе я выводил те записи из first, которые совпадают с number из second. Во втором хотел вывести те, которые не совпадают, и воспользовался по-моему мнению корректным подзапросом select из данной таблицы и оператором Not in. Результат не удовлетворил. Далее пошел экспериментировать и вручную задавать number-ы и тоже ничего не получилось. В чем я допустил промах?
Hant111 вне форума Ответить с цитированием
Старый 22.10.2011, 18:52   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В запросе №2 tSecondTable ts (index tralalala), все равно лишний, а так визуально больше проблем не вижу. Все должно работать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.10.2011, 19:24   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Допустим записей мало, и их можно просто перечислить списком:

Код:
insert into #tTimeTable
select tf.id
tf.number
tf.info
from tFirstTable tf (index tralala),
tSecondTable ts (index tralalala),
tFirdTable tfi (index tralalalala)
where tfi.Date between @datestart and @dateend
and tfi.id = tf.id 
and tf.number not in (1112223334445,
1112223334446,
2223377788855,
8884445566611)
Этот запрос отрабатывает некорректно.
уберите из from таблицу tSecondTable ts (index tralalala)
она же ни с кем не связана!

и на будущее запомните, что все указанные во FROM таблицы должны быть связанны друг с другом!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2011, 20:07   #6
Hant111
Пользователь
 
Регистрация: 21.03.2010
Сообщений: 12
По умолчанию

Благодарю, думаю из-за того, что я в 3 запросе, в from основного запроса внес tSecondTable он у меня не правильно отрабатывал.

Просто я тут маленький запрос привел для примера, на самом деле он гораздо больше, там штук 7 связей, видимо упустил.
Hant111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа функциями "ЕСЛИ", "И" и вывод текстового результата johny_03 Microsoft Office Excel 3 04.08.2014 11:01
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04