|   |   | 
| 
 | задачка оптимальный запрос | ☑ | ||
|---|---|---|---|---|
| 0
    
        andryscha1c 09.10.21✎ 21:08 | 
        Есть Таблица1
 Иванов Петров Сидоров Бикмамбетов Таблица2 Иванов Петров Можно ли получить только те записи из первой таблицы, которых нет во второй? то есть Сидоров, Бикмамбетов, использую запрос и ТОЛЬКО закладку связи соеденения без закладки условия? и как на ваш взгляд оптимальнее было бы построить запрос? | |||
| 1
    
        pechkin 09.10.21✎ 21:13 | 
        Не в (...)     | |||
| 2
    
        andryscha1c 09.10.21✎ 21:25 | 
        (1) это же условие получается, сейчас речь только про связи, можно ли на том уровне отсечь записи     | |||
| 3
    
        Asmody 09.10.21✎ 21:26 | 
        что оптимальнее - тебе расскажет только профайлер     | |||
| 4
    
        Asmody 09.10.21✎ 21:27 | 
        (2) отсечь записи, которых нет? да вы, батенька, затейник     | |||
| 5
    
        andryscha1c 09.10.21✎ 21:29 | 
        (4) отсечь записи с первой таблицы, как же нет то сынок     | |||
| 6
    
        RomanYS 09.10.21✎ 21:30 | 
        (2) левое соединение и условие есть null на вторую таблицу. Без условий совсем не получится     | |||
| 7
    
        andryscha1c 09.10.21✎ 21:33 | 
        (6) ну да, так и сделал. если совсем ни как без условий то вопросов нет.
 это же оптимальнее будет если не использовать связи, а все сделать на уровне условий c Не в (...)? | |||
| 8
    
        exwill 09.10.21✎ 21:51 | 
        (0) В любом случае решается задача "найти все соответствия таблицы1 и таблицы2". Она может решаться быстрее или медленнее в зависимости от того есть ли подходящие индексы или их нет. Но это всегда "под капотом". Повлиять на это можно только путем создания индексов, если их нет. В вашем случае они, как видно, есть. Поэтому выбросьте из головы. Пустое это     | |||
| 9
    
        pechkin 09.10.21✎ 21:54 | 
        (7) в некоторых случаях не работает быстрее чем соединение     | |||
| 10
    
        exwill 09.10.21✎ 21:55 | 
        Если делать нечего. Можете попробовать объединить и сгруппировать. Результат тот же. Но вряд ли быстрее     | |||
| 11
    
        серый КТУЛХУ 09.10.21✎ 21:59 | 
        ВЫБРАТЬ "Иванов" КАК Фио ПОМЕСТИТЬ втФио1
 ОБЪЕДИНИТЬ ВЫБРАТЬ "Петров" ОБЪЕДИНИТЬ ВЫБРАТЬ "Сидоров" ОБЪЕДИНИТЬ ВЫБРАТЬ "Бекмамбетов" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ "Иванов" КАК Фио ПОМЕСТИТЬ втФио2 ОБЪЕДИНИТЬ ВЫБРАТЬ "Петров" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втФио1.Фио, ВЫБОР КОГДА втФио2.Фио ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ПрФио2 ПОМЕСТИТЬ ФиоПр ИЗ втФио1 КАК втФио1 ЛЕВОЕ СОЕДИНЕНИЕ втФио2 КАК втФио2 ПО втФио1.Фио = втФио2.Фио ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФиоПр.Фио ИЗ ФиоПр КАК ФиоПр ВНУТРЕННЕЕ СОЕДИНЕНИЕ ФиоПр КАК ФиоПр1 ПО (ФиоПр.Фио = ФиоПр1.Фио И ФиоПр1.ПрФио2 = 1) | |||
| 12
    
        серый КТУЛХУ 09.10.21✎ 22:18 | 
        //или совсем короче
 ВЫБРАТЬ "Иванов" КАК Фио ПОМЕСТИТЬ Фио1 ОБЪЕДИНИТЬ ВЫБРАТЬ "Петров" ОБЪЕДИНИТЬ ВЫБРАТЬ "Сидоров" ОБЪЕДИНИТЬ ВЫБРАТЬ "Бекмамбетов" ; ВЫБРАТЬ "Иванов" КАК Фио ПОМЕСТИТЬ Фио2 ОБЪЕДИНИТЬ ВЫБРАТЬ "Петров" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Фио1.Фио КАК Фио, Фио2.Фио ЕСТЬ NULL КАК ПрФио ПОМЕСТИТЬ втФио ИЗ Фио1 ЛЕВОЕ СОЕДИНЕНИЕ Фио2 ПО Фио1.Фио = Фио2.Фио ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втФио1.Фио, втФио2.Фио ЕСТЬ NULL КАК ПрФио ИЗ втФио КАК втФио1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ втФио КАК втФио2 ПО (втФио1.Фио = втФио2.Фио И втФио1.ПрФио) | |||
| 13
    
        Ненавижу 1С гуру 09.10.21✎ 22:21 | 
        (11) ну да. 
 С таким же успехом я могу создавать временную таблицу с единственной записью единственного поля (это неважно) и делать внутреннее соединение исходных данных с этой таблицей. При этом всю секцию Где загонять условие связи. Профит: без условий в секции где | |||
| 14
    
        Garykom гуру 09.10.21✎ 22:23 | 
        (0) если ты хочешь https://oracleplsql.ru/except-sql.html
 то в 1С стандартно https://its.1c.ru/db/metod8dev/content/2499/hdoc | |||
| 15
    
        acht 09.10.21✎ 22:25 | 
        (12) Все проще
 ВЫБРАТЬ Таблица1.ФИО ИЗ Таблица1 ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 ПО Таблица1.ФИО = Таблица2.ФИО ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ 1 ) КАК Фильтр ПО Таблица2.ФИО ЕСТЬ NULL | |||
| 16
    
        acht 09.10.21✎ 22:28 | 
        (13) Ну да, оно и есть     | |||
| 17
    
        Garykom гуру 09.10.21✎ 22:30 | 
        итого я насчитал 3 способа
 интересно какой шустрей | |||
| 18
    
        acht 09.10.21✎ 22:31 | 
        (17) > какой шустрей
 Зависит от исходных данных, как всегда | |||
| 19
    
        серый КТУЛХУ 09.10.21✎ 22:52 | 
        (15): (короче - но не проще) спасибо! не знал такого приема...     | |||
| 20
    
        GANR 10.10.21✎ 00:18 | 
        (0) а чего глядеть то? генерируешь данные по миллиону строк, открываешь профайлер и пробуешь     | |||
| 21
    
        pechkin 10.10.21✎ 14:25 | 
        давеча была задача: Найти все элементы справочника, что не встречаются в регистре (блоками по 10000 штук) Сначала сделал все через соединение и ЕСТЬ NULL. Тормозило. Потом переделал на НЕ В (...) залетало | |||
| 22
    
        серый КТУЛХУ 10.10.21✎ 14:33 | 
        (21): попал в индекс?..     | |||
| 23
    
        acht 10.10.21✎ 15:59 | 
        (22) Операцией "НЕ" ? =)     | |||
| 24
    
        Dmitry77 10.10.21✎ 16:10 | 
        Обеденить 
 Таблица.Фио 1 как колво Обеденить Таблица2. Фио 1 В вт1 Вт1.фио Сумма(вт1.колво) В вт2 Группировка вт1.фио Выбрать различные 1 как контроль В вт3 Вт2.фио Внутренне соединение вт2.количество = вт3.контроль Как то так без условий. | |||
| 25
    
        acht 10.10.21✎ 16:32 | 
        (24) Надо доработать:
 ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1 ИСТИНА КАК Контроль В вт3 И потом ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО вт3.контроль = вт2.количество = 1 | |||
| 26
    
        NurSagen 10.10.21✎ 19:24 | 
        1 таблица
 Внутреннее с 1 же таблицей , Которая "лево" соединена со второй где фамилии не равны | |||
| 27
    
        Said_We 15.10.21✎ 14:45 | 
        (0) Как мне кажется, то на 1С оптимальнее вообще без соединения, но с условием.
 Если не на 1С, то в SQL есть разность множеств - EXCEPT и соответственно есть NOT EXCEPT. | |||
| 28
    
        Said_We 15.10.21✎ 14:52 | 
        "NOT EXCEPT" - только это прям так не пишется :-)
 Ща прочитал и сам понял, что могу быть не понят. | |||
| 29
    
        Жан Пердежон 15.10.21✎ 14:55 | 
        У скуля даже спец.физическая операция для твоей задачи есть: Left Anti Semi Join 
 Как это в запросе реализовать из названия должно быть ясно. | |||
| 30
    
        Kassern 15.10.21✎ 15:19 | 
        какой то такой изврат получился))
 Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ТЗ1.Имя КАК Имя |ПОМЕСТИТЬ ТЗ1 |ИЗ | &ТЗ1 КАК ТЗ1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ2.Имя КАК Имя |ПОМЕСТИТЬ ТЗ2 |ИЗ | &ТЗ2 КАК ТЗ2 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ1.Имя КАК Имя |ИЗ | ТЗ1 КАК ТЗ1 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2 | ПО (НЕ ТЗ1.Имя В | (ВЫБРАТЬ | ТЗ2.Имя | ИЗ | ТЗ2)) | |СГРУППИРОВАТЬ ПО | ТЗ1.Имя"; | |||
| 31
    
        Said_We 15.10.21✎ 15:25 | 
        (0) Без закладки условие - это на собеседовании такие вещи спрашивают что ли? :-)
 Выкопайте яму руками, хотя лопата тут есть и стоит, но пользоваться ей нельзя. Но можно палкой копалкой в виде условия в JOIN. Т.е. условие в JOIN использовать можно, а в Where нельзя? :-) А придумать другое тестовое задание по интереснее можно? .... | |||
| 32
    
        Kassern 15.10.21✎ 15:28 | 
        (30) потестил на 10тыс записях (в каждой таблице) в сравнении с обычным:
 |ГДЕ ЕСТЬNULL(ТЗ2.Имя, """") = """""; Быстрее отрабатывает с условием Где чем в связях. | |||
| 33
    
        серый КТУЛХУ 15.10.21✎ 15:33 | 
        (30): см.(15), "все уже украли до нас" (с)
 |ВЫБРАТЬ ТЗ1.Имя КАК Имя |ИЗ ТЗ1 КАК ТЗ1 | ЛЕВОЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2 ПО ТЗ1.Имя = ТЗ2.Имя | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 1) КАК Фильтр ПО ТЗ2.Имя ЕСТЬ NULL | |||
| 34
    
        Kassern 15.10.21✎ 15:34 | 
        (33) не удивлен) прост лень было всю ветку читать     | |||
| 35
    
        Kassern 15.10.21✎ 15:42 | 
        Может кто объяснить, в каком случае такой подход через соединения выгоден по сравнению с обычным условием отсекающим в ГДЕ?     | |||
| 36
    
        eTmy 15.10.21✎ 15:46 | 
        (35) только когда надо потешить самооценку, что смог без блока где ¯\_(ツ)_/¯     | |||
| 37
    
        Said_We 16.10.21✎ 02:34 | 
        (35) Внутреннее левое соединение с небольшой таблицей и с правильными индексами. Выгоден просто визуально читать кому-то. Как правило, по скорости будет примерно тоже самое, а читать некоторым удобнее через внутреннее соединение - как фильтр читают.
 JOIN - убийца производительности. Если можно без JOIN решить задачу, то надо решать без JOIN. | |||
| 38
    
        xXeNoNx 16.10.21✎ 02:37 | 
        (0) покажи свое решение     | |||
| 39
    
        rphosts 16.10.21✎ 04:53 | 
        (15) очень напоминает нутро РЛС     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |