Запрос - из 2-х таблиц=результат-записи, которые не входят во вторую таблицу

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

Быстрый переход