Имя: Пароль:
1C
1С v8
запрос not exists
,
0 prishliemail
 
31.07.13
10:40
Добрый день!

Необходимо выбрать договора, которые есть в одной таблице, но нет в другой.
В SQL делала бы с помощью not exists. Но в 1С такого оператора нет и не могу понять как его заменить.
Подскажите пожалуйста как это сделать.
1 sda553
 
31.07.13
10:41
левое соединение и в конце where справадоговор есть NULL
2 ДенисЧ
 
31.07.13
10:41
левое соединение и условие ЕСТЬ NULL
3 Fragster
 
модератор
31.07.13
10:56
не в (выбрать траляля), но лучше (1)(2)
4 shuhard
 
31.07.13
11:03
(0)[В SQL делала бы с помощью not exists. Но в 1С такого оператора нет ]
есть
5 prishliemail
 
31.07.13
11:07
(1) (2) (3) Спасибо!
(4) И как он называется? Так и писать not exists?
6 ДенисЧ
 
31.07.13
11:14
(5) читай (3)
7 Maxus43
 
31.07.13
11:18
В = IN в скуле, не совсем то
8 prishliemail
 
31.07.13
11:19
(6) ну это больше на not in похоже
9 prishliemail
 
31.07.13
11:19
Вообщем я поняла) Всем спасибо!
10 Ёпрст
 
31.07.13
11:20
(8) так и есть.
Нет реализации exists в снеговике, которая гораздо быстрее работает чем in
11 Fragster
 
модератор
31.07.13
11:20
(7) (поле1,поле2) В (Выбрать траляля) преобразуется в EXISTS
12 Maxus43
 
31.07.13
11:22
(11) а просто Поле1 В (выбрать траляля) в IN?
сервер 1с преобразует в exists только когда несколько полей, чего не поддерживает IN
13 Fragster
 
модератор
31.07.13
11:32
сейчас посмотрел в профайлер... интересно отражается реквизит ЭтоГруппа...

CASE
WHEN NOT _Reference79_Q_001_T_001._Folder = 0x01
THEN 0x01
WHEN _Reference79_Q_001_T_001._Folder = 0x01
THEN 0x00
END AS f_5
14 ДенисЧ
 
31.07.13
11:33
(13) не напутал?
15 Maxus43
 
31.07.13
11:39
(13) странно...
16 Fragster
 
модератор
31.07.13
11:43
(14) неа...
17 Fragster
 
модератор
31.07.13
11:43
кстати эксистс вызывается просто:

ГДЕ
    (Номенклатура.Ссылка,Истина) В
            (ВЫБРАТЬ
                ТЗ.Ссылка,Истина
            ИЗ
                ТЗ)
18 Fragster
 
модератор
31.07.13
11:43
ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.ПометкаУдаления,
    Номенклатура.Предопределенный,
    Номенклатура.Родитель,
    Номенклатура.ЭтоГруппа,
    Номенклатура.Код,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    (Номенклатура.Ссылка,Истина) В
            (ВЫБРАТЬ
                ТЗ.Ссылка,Истина
            ИЗ
                ТЗ)


превращается в

SELECT
_Reference79_Q_001_T_001._IDRRef AS f_1,
_Reference79_Q_001_T_001._Marked AS f_2,
_Reference79_Q_001_T_001._IsMetadata AS f_3,
_Reference79_Q_001_T_001._ParentIDRRef AS f_4,
CASE
WHEN NOT _Reference79_Q_001_T_001._Folder = 0x01
THEN 0x01
WHEN _Reference79_Q_001_T_001._Folder = 0x01
THEN 0x00
END AS f_5,
_Reference79_Q_001_T_001._Code AS f_6,
_Reference79_Q_001_T_001._Description AS f_7
FROM
_Reference79 _Reference79_Q_001_T_001 WITH(NOLOCK)
WHERE
EXISTS(
SELECT
#T631865445ffd458d981e5607e594c885_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRef,
0x01 AS _Q_002_F_001
FROM
#tt13 #T631865445ffd458d981e5607e594c885_Q_002_T_001 WITH(NOLOCK)
WHERE
_Reference79_Q_001_T_001._IDRRef = #T631865445ffd458d981e5607e594c885_Q_002_T_001._Q_000_F_000RRef)
19 Maxus43
 
31.07.13
11:51
(18) Быстрей ли будет? На маленьких и больших объёмах вложенной выборки?
20 Serginio1
 
31.07.13
11:54
(13) Видно для сортировки флаг для групп 0, для элементов 1
21 Fragster
 
модератор
31.07.13
11:54
(19) результат "не в"

просто не в: 479 мс
не в с отбором вложенного запроса: 485 мс
(Номенклатура, Истина )не в: 478 мс

надо посложнее что-то
22 Fragster
 
модератор
31.07.13
12:03
но вообще где много совпадений (заменил НЕ В на В, чтобы было больше) вариант (17) стабильно чуть быстрее, но надо смотреть в каждом случае.

Для В внутреннее соединение быстрее, для "не в" - быстрее (поле,истина) чем левое и есть NULL, но все равно надо экспериментировать в каждом конкретном случае, ИМХО