Выбрать записи которых нет в другой таблице 1с

Обновлено: 07.07.2024

В данном случае WHERE в подзапросе не нужен :)
Это ты видимо из NOT EXISTS случайно загрёб :)

Posted via ActualForum NNTP Server 1.2

В данном случае WHERE в подзапросе не нужен :)
Это ты видимо из NOT EXISTS случайно загрёб :)

К Urri - разве в Досовом Фоксе можно Select из Selecta вызывать ?
мне кажется вложенные селеkты с 7 визуал фокса появились.

К Urri - разве в Досовом Фоксе можно Select из Selecta вызывать ?
мне кажется вложенные селеkты с 7 визуал фокса появились.

В данном случае WHERE в подзапросе не нужен :)
Это ты видимо из NOT EXISTS случайно загрёб :)

Posted via ActualForum NNTP Server 1.2

результаты
Вар 1 = 0.352
Вар 2 = 0.621
Вар 3 = 0.781

Быстрее всего Вариант URRI

Ну оптимизатор вещь тонкая :) Просто сама суть подзапроса после IN - это
выбрать некоторый список, и потом по нему фильтровать - это
НЕкоррелированный подзапрос. А если добавить к нему условие связи с
"внешней" таблицей - мы получим коррелированный подзапрос - он будет на
каждой итерации выбирать всего 1 или 0 записей (логически, на самом деле не
совсем так о чём далее.) т.е. по сути не будет отличаться от условия с
EXISTS - просто вместо проверки "есть запись" будет выполняться "пустая"
проверка "a.id=b.id" - в которой значение имеет не собсвтенно ЧТО
сравнивается (это сравнение уже в WHERE прошло), а сам факт - если ли справа
хоть что-то или нету :)

Posted via ActualForum NNTP Server 1.2

> В VFP6 можно было использовать (в более старших версиях не работает):

Результаты у меня выглядят несколько иначе - выигрывает всегда первый
вариант, твой модифицированный вариант идёт вторым (даже если учитывать
некорректную работу под VFP7), затем идёт 2 и наконец 3.

VFP9
вариант 1 0,550
вариант 2 1,082
вариант 3 1,262
вариант 4 0,751

VFP8SP1
вариант 1 0,571
вариант 2 0,971
вариант 3 1,212
вариант 4 0,681

VFP7SP1
вариант 1 0,461
вариант 2 1,021
вариант 3 1,302
вариант 4 0,551

Вариант
select c1.* from c1 where NOT EXIST (select * from c2 where c2.nn=c1.nn)
INTO CURSOR cr
отрабатывает примерно так-же как и вариант 1 (и с корректностью результата
проблем тоже нет).

Результаты могут отличаться, если использовать для теста не курсор, а
реальные таблицы - уже хотя-бы потому что разные версии фокса по разному
строят индексы (VFP7 самые большие делает :) ). Также может влиять то, как
создан индекс - ДО заполнения или ПОСЛЕ заполнения таблиц.

вопрос наверно простой - но не могу сама разобраться. Есть таблица с тремя колонками, есть вторая таблица тоже с 3-колонками - все это во временных таблицах запроса. записи первой таблицы полностью содержат записи второй. как бы вывести те записи, которых нет во второй таблице? спасибо за помощь.

выбрать все записи из врем.таб. во вложенном запросе, а потом из него "Выбрать различные".

Запрос в студию

"<pre>Процедура КнопкаВыполнитьНажатие(Кнопка)<br> <br> ТЗ1 = Новый ТаблицаЗначений;<br> <br> ТЗ1.Колонки.Добавить("кол1", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> ТЗ1.Колонки.Добавить("кол2", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> ТЗ1.Колонки.Добавить("кол3", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> <br> Для н = 1 По 3 Цикл<br> <br> НовСтр = ТЗ1.Добавить();<br> <br> НовСтр.Кол1 = "А" + н;<br> НовСтр.Кол2 = "Б" + н;<br> НовСтр.Кол3 = "В" + н;<br> <br> КонецЦикла; <br> <br> ТЗ2 = ТЗ1.Скопировать();<br> <br> НовСтр = ТЗ2.Добавить();<br> <br> НовСтр.Кол1 = "А4";<br> НовСтр.Кол2 = "Б4";<br> НовСтр.Кол3 = "В4";<br> <br> Запрос = Новый Запрос;<br> <br> Запрос.Текст =<br> "ВЫБРАТЬ<br> | ВнИст1.Кол1,<br> | ВнИст1.Кол2,<br> | ВнИст1.Кол3<br> |ПОМЕСТИТЬ ВТ1<br> |ИЗ<br> | &Ист1 КАК ВнИст1<br> |;<br> |<br> |//////////////////////////////////////////////////////////// ­////////////////////<br> |ВЫБРАТЬ<br> | ВнИст2.Кол1,<br> | ВнИст2.Кол2,<br> | ВнИст2.Кол3<br> |ПОМЕСТИТЬ ВТ2<br> |ИЗ<br> | &Ист2 КАК ВнИст2<br> |;<br> |<br> |//////////////////////////////////////////////////////////// ­////////////////////<br> |ВЫБРАТЬ<br> | ВТ1.Кол1,<br> | ВТ1.Кол2,<br> | ВТ1.Кол3<br> |ИЗ<br> | ВТ1 КАК ВТ1<br> |<br> |ОБЪЕДИНИТЬ<br> |<br> |ВЫБРАТЬ<br> | ВТ2.Кол1,<br> | ВТ2.Кол2,<br> | ВТ2.Кол3<br> |ИЗ<br> | ВТ2 КАК ВТ2"<br> ;<br> <br> Запрос.УстановитьПараметр("Ист1", ТЗ1);<br> Запрос.УстановитьПараметр("Ист2", ТЗ2);<br> <br> Результат = Запрос.Выполнить();<br> <br> ТЗ = Результат.Выгрузить();<br> <br> ТЗ.ВыбратьСтроку();<br> <br>КонецПроцедуры </pre>"

Читайте также: