Имя: Пароль:
1C
 
Левое соединение или оператор "В"
,
0 ЭЦ
 
19.08.21
19:08
ГОСПОДА !
Как более грамотно выбрать всех не лысых если имеется таблица всех людей и всех лысых людей.
Возможены варианты

ВЫБРАТЬ
   ТаблицаВсех.ФизЛицо
ИЗ
   ТаблицаВсех
ЛЕВОЕ СОЕДИНЕНИЕ
   ТаблицаЛысых
ПО
   ТаблицаВсех.ФизЛицо = ТаблицаЛысых.ФизЛицо
ГДЕ
   ТаблицаЛысых.ФизЛицо ЕСТЬ NULL

или

ВЫБРАТЬ
   ТаблицаВсех.ФизЛицо
ИЗ
   ТаблицаВсех
ГДЕ
   НЕ ТаблицаВсех.ФизЛицо В (ВЫБРАТЬ ТаблицаЛысых.ФизЛицо ИЗ ТаблицаЛысых)

Прошу подсказать.
1 Guk
 
19.08.21
19:10
(0) первый запрос не выберет всех не лысых...
2 ЭЦ
 
19.08.21
19:13
(1) Уважаемый. Разрешите с Вами не согласиться - он выберет.
3 Asmody
 
19.08.21
19:13
"НЕ В()" в запросе – это чаще всего кошмар
4 rphosts
 
19.08.21
19:16
в первом запросе вместо ГДЕ не должно быть ИМЕЮЩИЕ?

Второй запрос должен быть транслирован оптимизатором запросов в Semi Join и наверное должен быть оптимальнее (чисто умозрительнее, извини влом...)... но скорее можно сделать ещё лучше если втащить лысых в ВТ и искать в ВТ или даже так: втащить в ВТ +  индексировать ВТ по полю поиска
5 ЭЦ
 
19.08.21
19:19
(4)  Хор.
Пусть обе таблицы будут Проиндексированные ВТ.
Тогда как лучше?
(3) В чем состоит ужас "НЕ" в запросе прошу пояснить
6 Asmody
 
19.08.21
19:21
(5) само по себе НЕ не кошмар. а вот сочетание НЕ В() уже не очень.
7 rphosts
 
19.08.21
19:29
(5) нагенери себе большие таблички и сделай несколько раз замер времени выполнения запроса... Получиш объективный ответ
8 rphosts
 
19.08.21
19:30
Все же не semi join а exists видимо.
9 ЭЦ
 
19.08.21
19:30
(6) т.е. Вы за 1-ый вариант?
(7) Я надеюсь тут ктото уже нагенерил.
10 Ненавижу 1С
 
гуру
19.08.21
20:22
Я еще умею через объединить все в подзапросе
11 Asmody
 
19.08.21
20:28
(9) "За" или "против" скажет только профайлер. И, да, на разных объемах таблиц результат может быть разным.
12 ДенисЧ
 
19.08.21
20:28
(9) А ты уже заплатил за нагенерить? ))
13 ДенисЧ
 
19.08.21
20:29
(11) Почему "может"?
14 Asmody
 
19.08.21
20:31
(13) Я нарочно не стал быть категоричным
15 Spieluhr
 
19.08.21
20:38
(0) А в чем измеряется грамотность в данном случае? Грамотно - это сколько?
16 Asmody
 
19.08.21
21:04
(15) На полшишечки
17 VS-1976
 
19.08.21
22:24
В данном случае, я за левое соединение, тем более что левые связи всегда приятнее )
18 Ёпрст
 
19.08.21
22:31
(0) план запроса посмотри, он скорее всего будет одинаков. инер джоин жешь
19 Sammo
 
20.08.21
07:43
Сталкивался с проблемой, что когда большое количество значений по которым идет В () то бывают проблемы с производительностью. Левое в этом смысле стабильнее.
Либо посмотри как сделать, чтобы в скуле в преобразовывалось не в in, а в exist
20 Sammo
 
20.08.21
07:44
+19 например, речь про большое количество значений, когда не селективный индекс и на очень большой таблице скуль сваливается в перебор
21 Малыш Джон
 
20.08.21
08:19
(16) ну возможно ТСу такого уровня грамотности недостаточно? Поэтому и заводит такие темы
22 Малыш Джон
 
20.08.21
08:19
(0) делай через объединение: красота, нет ни левых соединений, ни левых условий
23 Ёпрст
 
20.08.21
09:33
(22) как он это сделает, если EXCEPT в 1с не завезли?
24 ЭЦ
 
20.08.21
10:25
(10,22) Через объединить - это примерно так?
ВЫБРАТЬ  
   Подзапрос.ФизЛицо
ИЗ
(ВЫБРАТЬ
   ТаблицаВсех.ФизЛицо,
   1 КАК Кол
ИЗ
   ТаблицаВсех

ОБЪЕДИНИТЬ  ВСЕ

ВЫБРАТЬ
   ТаблицаЛысых.ФизЛицо,
   1
ИЗ
   ТаблицаЛысых
) КАК Подзапрос
ГДЕ
   СУММА(Подзапрос.Кол) = 1
СГРУППИРОВАТЬ ПО
   Подзапрос.ФизЛицо
25 mistеr
 
20.08.21
10:41
(0) Левое соединение, согласно рекомендациям 1С.
26 Малыш Джон
 
20.08.21
11:45
(23) Если есть мозги, то неважно завезли чего куда или нет. Если мозгов нет, то опять-таки, всё вышенаписанное неважно.
27 Ненавижу 1С
 
гуру
20.08.21
11:49
(24) почти

ВЫБРАТЬ  
   Подзапрос.ФизЛицо
ИЗ
(ВЫБРАТЬ
   ТаблицаВсех.ФизЛицо,
   0 КАК Кол
ИЗ
   ТаблицаВсех

ОБЪЕДИНИТЬ  ВСЕ

ВЫБРАТЬ
   ТаблицаЛысых.ФизЛицо,
   1
ИЗ
   ТаблицаЛысых
) КАК Подзапрос

СГРУППИРОВАТЬ ПО
   Подзапрос.ФизЛицо
ИМЕЮЩИЕ
   СУММА(Подзапрос.Кол) = 0
28 seevkik
 
20.08.21
11:56
Всё зависит от интерпретатора, но соединения сильно стабильнее, чем "В", да и имхо легче читать