Запрос - из 2-х таблиц=результат-записи, которые не входят во вторую таблицу
14.09.2011
10:55
#11
"
Процедура КнопкаВыполнитьНажатие(Кнопка) ТЗ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); Результат = Запрос.Выполнить(); ТЗ = Результат.Выгрузить(); ТЗ.ВыбратьСтроку(); КонецПроцедуры " 14.09.2011
21:23
#13
Зачем циклами делать? Запросом нормально получается.
Если надо вывести строки, которые есть в ТЗ2, но нет в ТЗ1 (из первого примера Дениса - это "а4,б4,в4"), то запрос такой:
Если надо вывести строки, которые есть в ТЗ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
16.09.2011
09:30
#14
Да, это еще более компактный запрос (только на "Есть Null" каждую колонку надо проверить).
16.09.2011
09:36
#15
Если соответствующая запись не нашлась левым соединением по связке 3-х колонок, то из правой таблицы все колонки будут NULL.
16.09.2011
12:02
#16
А обратное утверждение верно?
Не совсем обратное
То, которое вы установили в запросе.
Если одна колонка Null, это значит, что эта строка во второй таблице не нашлась?
Не совсем обратное
Если одна колонка Null, это значит, что эта строка во второй таблице не нашлась?
16.09.2011
12:24
#17
Да, если не нашлась, значит NULL.
NULL значит не нашлась (отсутствует запись и соотпетственно все поля).
Каких-то других вариантов, когда в колонке NULL я не могу представить.
Если запись нашлась, но в поле ничего не заполнено, то будет Неопределено.
NULL значит не нашлась (отсутствует запись и соотпетственно все поля).
Каких-то других вариантов, когда в колонке NULL я не могу представить.
Если запись нашлась, но в поле ничего не заполнено, то будет Неопределено.
17.09.2011
08:11
#18
"Неопределено" не может быть в запросе. Даже составной тип всегда требуется через "Выразить()" оформлять.
17.09.2011
14:13
#19
В определенных случаях требуется через Выразить, но что значит "Всегда требуется через Выразить"?
Нельзя разве такой запрос выполнить?
Кстати насчет того когда еще может быть NULL.
Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".
Нельзя разве такой запрос выполнить?
ВЫБРАТЬ ЗарплатаКВыплатеОрганизаций.Ссылка, ВЫБОР КОГДА ЗарплатаКВыплатеОрганизаций.ДокументОснование = НЕОПРЕДЕЛЕНО ТОГДА " !!! Неопределено !!!" ИНАЧЕ ЗарплатаКВыплатеОрганизаций.ДокументОснование КОНЕЦ КАК ДокументОснованиеИЗ Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплатеОрганизаций
Кстати насчет того когда еще может быть NULL.
Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".
17.09.2011
17:51
#20
> Нельзя разве такой запрос выполнить?
Можно выполнить, но работать он будет только если поле "ДокументОснование" составного типа.
И если в него не записали пустую ссылку любого подходящего для него типа.
Вот в таком случае
> Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".
и может быть во втором запросе одна колонка NULL, а остальные значимые. Поэтому и вопрос, а не надо ли проверять их все на NULL, чтобы убедиться, что это строка, к которой не нашли соответствие в первой таблице.
Можно выполнить, но работать он будет только если поле "ДокументОснование" составного типа.
И если в него не записали пустую ссылку любого подходящего для него типа.
Вот в таком случае
> Если написать "ВЫБОР КОГДА..." и нет ни одного истинного условия и нет "ИНАЧЕ", то получится NULL. Т.е. "никакое поле таблицы и вообще ничего здесь не выводится".
и может быть во втором запросе одна колонка NULL, а остальные значимые. Поэтому и вопрос, а не надо ли проверять их все на NULL, чтобы убедиться, что это строка, к которой не нашли соответствие в первой таблице.
Читают тему
(гостей: 1)