Как получить записи из первой таблицы которых нет во второй? #678006


#0 by Плот
Ребята привет! Сабж. Понимаю что как то нужно проверят на NULL, но только как?
#1 by shuhard
охеренная неожиданность ?
#2 by Sammo
Левое соединение и проверка на Есть NULL
#3 by Fragster
Где поле не в (выбрать поле из таблица2)
#4 by ДемонМаксвелла
#5 by Mouzem
а разве не ввели расстрел за NULL? по мне, так только как говорит делать, так и только так.
#6 by Лодырь
А теперь расскажите мне, что вы будете делать если в табличках более 1 поля.
#7 by Fragster
Где (Поле1, Поле2) Не в (Выбрать Поле1, Поле2 Из Таблица2)
#8 by Fragster
не, не ввели
#9 by dk
соединение по нужному количеству полей
#10 by ДенисЧ
Ввели расстрел за не использование естьнулла..
#11 by Креатив
Можно ещё выбрать из первой таблицы записи, которых нет во внутреннем соединении.
#12 by Лодырь
А чем выгоднее чем соединение?
#13 by timurhv
Безбожно тормозит на больших объемах данных.
#14 by Fragster
просто нужно понимать, как оно работает
#15 by acsent
так это то же соединение, разве нет?
#16 by Fragster
переделал код из на "Не в" и Левое соединение ... есть NULL, запустил
#17 by Basilio
А что не так с ЕстьNull-ом?
#18 by Fragster
+ Количество ~160к, отбор ~8к, повторений: 1 Отбор через массив: 1 Отбор через левое соединение: 1 Отбор через не В: 189 Отбор через не В (Exists): 1 Отбор через внутреннее соединение + индекс: 1 Отбор через не В + индекс: 1 Отбор через не В (Exists) + индекс: 1
#19 by Fragster
дисквалифицировали В за унылость, увеличили повторения до 10: Количество: 162 168 отбор: 8 108 повторений: 10 Отбор через массив: 18 Отбор через соединение: 16 Отбор через В (Exists): 17 Отбор через соединение + индекс: 16 Отбор через В + индекс: 17 Отбор через В (Exists) + индекс: 17
#20 by Dmitry77
можно загрузить обе таблицы в одну большую,добавить числовое поле, для первой 1, для второй 2. Потом сгруппировать с сумированием по новому полю, потом отобрать только записи, где сумма = 1 (будут только те что в 1 таблице) =2 где только во второй = 3 где в обоих.
#21 by Dmitry77
попробуй запусти через объединение, интересно сколько покажет времени.
#22 by Fragster
Количество: 162 170 отбор: 8 108 повторений: 10 Отбор через массив: 18 Отбор через соединение: 16 Отбор через В (Exists): 15 Отбор через соединение + индекс: 15 Отбор через В + индекс: 17 Отбор через В (Exists) + индекс: 16 Отбор через Объединение: 27
#23 by Fragster
#24 by Dmitry77
спасибо.
#25 by Mouzem
Чет я не догнал, получается что объединить 2 таблицы и отобрать по нулу быстрее чем "не в"?
#26 by Fragster
мораль в том, что нужно в каждом конкретном случае проверять отдельно разные варианты
#27 by viktor_vv
Поэксприментировал немного с планами запросов. Есть сомнение по корректности теста на exist. Конкретное на |ГДЕ судя по тому во что 1С транслирует такую конструкцию для скуля ( из ) там получается   AND EXISTS(SELECT 1 FROM #tt2 T2 WITH(NOLOCK) WHERE (T1._Fld18873RRef = T2._Q_001_F_000RRef) AND (T1._Fld18875RRef = T2._Q_001_F_001RRef)) В случае если второе поле Истина, мне кажется, при трансляции его просто пропустят и останется exist по одному полю. При этом для in и exist по одному полю строятся абсолютно одинаковые планы запроса. Select id From sc72 Where id in (select id from #tempkl) Select id From sc72 as sc Where exists (select id from #tempkl where id = sc.id ) а вот для exsist по двум полям уже другой план c hash match Select id From sc72 as sc Where exists (select id from #tempkl where id = sc.id and sp81=sc.sp81)
#28 by Fragster
за планы не смотрел, а факт в том, что В по одному полю транслируется в in, а по 2м и более - в exists (по крайней мере для mssql)
#29 by viktor_vv
Согласен, но меня смущает именно второе поле Истина. Лучше бы может дернуть во временную таблицу реальное поле вместо Истина. К тому же план для Select id From sc72 as sc Where exists (select id from #tempkl where id = sc.id and 1=1) идентичен по одному полю и in.
#30 by Fragster
да. а вот для НЕ В - уже очень разные планы, судя по времени выполнения, которое в 200 раз различается
#31 by viktor_vv
Есть такое Для in получается Nested loops / inner join Для not in получается Merge join / Left anti semi join это еще зависит от соотношения количества записей в таблицах и наличия индекса.
#32 by viktor_vv
+ Для второго я не очень понимаю механизм этой операции, надо бы почитать умных книжек :).
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С