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

Новая тема
Показывать по 10 20 40 сообщений
"
Процедура КнопкаВыполнитьНажатие(Кнопка)  ТЗ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);  Результат = Запрос.Выполнить();  ТЗ = Результат.Выгрузить();  ТЗ.ВыбратьСтроку(); КонецПроцедуры 
"
Да, сделала не запросом, а циклом.
Зачем циклами делать? Запросом нормально получается.
Если надо вывести строки, которые есть в ТЗ2, но нет в ТЗ1 (из первого примера Дениса - это "а4,б4,в4"), то запрос такой:


ВЫБРАТЬ    ВТ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 
Да, это еще более компактный запрос (только на "Есть Null" каждую колонку надо проверить).
Если соответствующая запись не нашлась левым соединением по связке 3-х колонок, то из правой таблицы все колонки будут NULL.
А обратное утверждение верно?
Не совсем обратное :) То, которое вы установили в запросе.
Если одна колонка Null, это значит, что эта строка во второй таблице не нашлась?
Да, если не нашлась, значит NULL.
NULL значит не нашлась (отсутствует запись и соотпетственно все поля).
Каких-то других вариантов, когда в колонке NULL я не могу представить.
Если запись нашлась, но в поле ничего не заполнено, то будет Неопределено.
"Неопределено" не может быть в запросе. Даже составной тип всегда требуется через "Выразить()" оформлять.
В определенных случаях требуется через Выразить, но что значит "Всегда требуется через Выразить"?

Нельзя разве такой запрос выполнить?
ВЫБРАТЬ    ЗарплатаКВыплатеОрганизаций.Ссылка,    ВЫБОР        КОГДА ЗарплатаКВыплатеОрганизаций.ДокументОснование = НЕОПРЕДЕЛЕНО            ТОГДА " !!! Неопределено !!!"        ИНАЧЕ ЗарплатаКВыплатеОрганизаций.ДокументОснование    КОНЕЦ КАК ДокументОснованиеИЗ    Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплатеОрганизаций



Кстати насчет того когда еще может быть NULL.
Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".
> Нельзя разве такой запрос выполнить?
Можно выполнить, но работать он будет только если поле "ДокументОснование" составного типа.
И если в него не записали пустую ссылку любого подходящего для него типа.


Вот в таком случае
> Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".

и может быть во втором запросе одна колонка NULL, а остальные значимые. Поэтому и вопрос, а не надо ли проверять их все на NULL, чтобы убедиться, что это строка, к которой не нашли соответствие в первой таблице.
Читают тему
(гостей: 1)

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