|
запрос 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, но все равно надо экспериментировать в каждом конкретном случае, ИМХО |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |