powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Предикат NOT IN
14 сообщений из 14, страница 1 из 1
Предикат NOT IN
    #33048424
boyza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
У меня такая задача. Нужно вывести записи из таблицы matlist , id которых нет в таблице demands (matlist - справочник)

SELECT DISTINCT matlist.id_mat, matlist.nomenclature, matlist.style_mat FROM matlist JOIN demands ON matlist.id_mat IN (demands.id_mat)
---
Так правильно показывает, какие материалы встречаются в demands
Стоит добавить NOT - показывает абсолютно все материалы из справочника (а не инвертируется). NOT добавлял как и после ON, так и перед IN ...

Делал еще так.
SELECT id_mat INTO ARRAY lalala FROM demands

SELECT DISTINCT matlist.id_mat, matlist.nomenclature, matlist.style_mat FROM matlist JOIN demands ON matlist.id_mat IN (lalala)
---
Здесь как и с НОТ, так и без него рассматривается только первая запись в массиве

Что я делаю не так?
Спасибо за ответ
p.s. foxpro 6
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33048473
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT DISTINCT matlist.id_mat, matlist.nomenclature, matlist.style_mat ;
FROM matlist ;
WHERE matlist.id_mat NOT IN (SELECT id_mat FROM demands) 
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33048483
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не ошибаюсь
select matlist.id from matlist where id ! in (select id from demands)
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33048584
boyza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо! :)

(уже сам не знаю зачем я жоин туда вплел...)
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33050836
ank_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Код: plaintext
1.
2.
SELECT DISTINCT matlist.id_mat, matlist.nomenclature, matlist.style_mat ;
FROM matlist ;
WHERE matlist.id_mat NOT IN (SELECT id_mat FROM demands) 

SELECT much faster with IS NULL
Код: plaintext
1.
2.
3.
4.
SELECT DISTINCT matlist.id_mat, matlist.nomenclature, matlist.style_mat ;
FROM matlist ;
LEFT JOIN demands ON matlist.id_mat =demands.id_mat 
WHERE demands.id_mat IS NULL
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33050926
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ank_guest

Нет. Не будет.

Тестировал на VFP6SP5 года 2 назад именно подобные запросы. Было 3 варианта:

NOT IN
LEFT JOIN ... HAVING IsNull()=.T.
NOT EXISTS(...)

Так вот, NOT IN из них самый быстрый. LEFT JOIN и NOT EXISTS() примерно одинаковые по времени, но раза в 2 медленнее, чем NOT IN

Покопайся в архиве на http://forum.foxclub.ru/list.php?f=5 Было обсуждение результатов этого тестирования. Сейчас не помню ссылку
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33050953
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот. Нашел тему с обсуждением сравнения скорости подобных запросов

http://forum.foxclub.ru/read.php?f=5&i=60927&t=60819&cp=1
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33050962
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ank_guest

Отличное решение, за исключением одного НО - LEFT JOIN тут не нужен, поскольку условие в WHERE делает обьединение INNER JOIN.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CLEAR
?SET('DELETED')
* табличка с наименованиями
CREATE CURSOR test (id i, cName c( 10 ))
SELECT test
INDEX ON id TAG id
* табличка с их встречаемостью
CREATE CURSOR test1 (id i, ID_Test i)
SELECT test1
INDEX ON id_test TAG id_test

INSERT INTO test (id, cName) VALUES ( 1 , 'one')
INSERT INTO test (id, cName) VALUES ( 2 , 'two')
INSERT INTO test (id, cName) VALUES ( 3 , 'three')

INSERT INTO test1 (id, ID_Test) VALUES ( 1 ,  1 )
INSERT INTO test1 (id, ID_Test) VALUES ( 2 ,  1 )
INSERT INTO test1 (id, ID_Test) VALUES ( 3 ,  3 )

* получаем одну запись, хотя просили LEFT
SELECT t.* FROM test t LEFT JOIN test1 t1 on t.id = t1.id_test where ISNULL(t1.id_test) nofilter
* а вот истинный LEFT включающий все записи из левой таблицы ( 3  штуки)
SELECT t.* FROM test t LEFT JOIN test1 t1 on t.id = t1.id_test and ISNULL(t1.id_test) nofilter
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33051002
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дико извеняюсь за вмешательство но у меня и в первом и во втором запросе по три записи чего не понял?
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33051058
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опс.

Тест в 5-ке возвращает
для 1-ого - 0 записей
для 2-ого - 3 записи

Тест в 7-ке возвращает
для 1-ого - 3 записей
для 2-ого - 3 записи

Тест в 9-ке возвращает
для 1-ого - 1 записей
для 2-ого - 3 записи

Как видим прогрес в SQL движке налицо.
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33051067
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё убрал индексы

5-ка
не отреагировала

7-ка
стала правильно работать

9-ка
не повлияло
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33051735
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi PaulWist!

На самом деле это был глюк в SQL движке - и его поправили - то-ли полностью в 7-ке, то-ли частично в 7-ке и окончательно в 8-ке :)
Проявлялся он как раз с IS NULL, ISNULL() и NVL()

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33051994
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Игорь

Igor Korolyov и его поправили - то-ли полностью в 7-ке, то-ли частично в 7-ке и окончательно в 8-ке

Ну ты хоть до конца все мои посты прочел, а если прочел , то наверное смог сделать вывод, что поправили в 9-ке точно, а в 7-ке всё было по старому.
...
Рейтинг: 0 / 0
Предикат NOT IN
    #33054699
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi PaulWist!

1) Прочёл, но не все буквы угадал :)
2) В 7-ке ЯВНО это правили - без индекса оно работает корректно, как ты сам и заметил. Но не до конце сделали... С индексом выходит ерунда :(
3) А вот в 8-ке видимо окончательно вылечили - там и с индексом и без него работает как положено.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Предикат NOT IN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]