Вход | Регистрация
 

Левое соединение или оператор "В"

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

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

или

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

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

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

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

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.