В поиске ответа на вопрос "Как из одной выборки убрать записи присутствующие во второй выборке" я наткнулся на тему "Разность таблиц в запросе", но она не одарила меня полным пониманием. С вашего позволения в новой теме (тема по ссылке закрыта) приведу готовое решение, с небольшим пояснением для себя из прошлого. (: Может кому еще пригодится.
Текст задания №8:
Найдите производителя, выпускающего компьютеры, но не ноутбуки. Вывести: Производитель
Код, выдающий верный результат:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Оборудование.Производитель
ПОМЕСТИТЬ ВТКомпьютеры
ИЗ
Справочник.Компьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.Оборудование КАК Оборудование
ПО
Оборудование.Модель = Компьютеры.Модель
;
ВЫБРАТЬ РАЗЛИЧНЫЕ
Оборудование.Производитель
ПОМЕСТИТЬ ВТНоутбуки
ИЗ
Справочник.Ноутбуки КАК Ноутбуки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.Оборудование КАК Оборудование
ПО
Оборудование.Модель = Ноутбуки.Модель
;
ВЫБРАТЬ
Компьютеры.Производитель
ИЗ
ВТКомпьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
ВТНоутбуки КАК Ноутбуки
ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
Ноутбуки.Производитель is NULL
Показать
Что происходит?
Используется Пакетный Запрос, состоящий из трех частей:
1) Возвращает производителей производящих Компьютеры (А, Б, Е) и помещает
их во временную таблицу "ВТКомпьютеры".
ВЫБРАТЬ РАЗЛИЧНЫЕ
Оборудование.Производитель
ПОМЕСТИТЬ ВТКомпьютеры
ИЗ
Справочник.Компьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.Оборудование КАК Оборудование
ПО
Оборудование.Модель = Компьютеры.Модель
Показать
2) Возвращает производителей производящих Ноутбуки (А, Б, Ц) и помещает их во временную таблицу "ВТНоутбуки".
ВЫБРАТЬ РАЗЛИЧНЫЕ
Оборудование.Производитель
ПОМЕСТИТЬ ВТНоутбуки
ИЗ
Справочник.Ноутбуки КАК Ноутбуки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.Оборудование КАК Оборудование
ПО
Оборудование.Модель = Ноутбуки.Модель
Показать
3) Тут происходит то самое "Необходимо проверить, какие производители производят компьютеры, а затем добавить условие, которое будет проверять, что этих производителей нет среди тех, кто производит ноутбуки".
Если мы выберем все колонки и применим левое соединение к нашим временным таблицам,
ВЫБРАТЬ
*
ИЗ
ВТКомпьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
ВТНоутбуки КАК Ноутбуки
ПО Компьютеры.Производитель = Ноутбуки.Производитель
то получится таблица:
Производитель 1 | Производитель 2
А | А
Б | Б
Е | NULL
ЛЕВОЕ СОЕДИНЕИЕ в результат запроса включило комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию, и записи из первого источника, для которых не найдено соответствующих условию записей из второго источника. Так появилась строка с производителем Е, которому не нашлось пары (NULL).
Нам осталось только добавить условие в , что мы хотим именно тех у кого нет пары:
ВЫБРАТЬ
*
ИЗ
ВТКомпьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
ВТНоутбуки КАК Ноутбуки
ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
Ноутбуки.Производитель is NULL
Показать
Получим:
Производитель 1 | Производитель 2
Е | NULL
И выбрать нужный столбец:
ВЫБРАТЬ
Компьютеры.Производитель
ИЗ
ВТКомпьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ
ВТНоутбуки КАК Ноутбуки
ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
Ноутбуки.Производитель is NULL
Показать
Получим:
Производитель 1
Е
Шпаргалка по соединениям таблиц:
В данном примере использовалось А минус Б (левый столбик, второй сверху).
ВЫБРАТЬ РАЗЛИЧНЫЕ
Оборудование.Производитель
//,Оборудование.ТипОборудования
ИЗ
Справочник.Компьютеры КАК Компьютеры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оборудование КАК Оборудование
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Оборудование.Производитель КАК ПроизводительНоутбуков
ИЗ
Справочник.Ноутбуки КАК Ноутбуки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оборудование КАК Оборудование
ПО Ноутбуки.Модель = Оборудование.Модель
СГРУППИРОВАТЬ ПО
Оборудование.Производитель) КАК ПроизводителиНоутбуков
ПО Оборудование.Производитель = ПроизводителиНоутбуков.ПроизводительНоутбуков
ПО Компьютеры.Модель = Оборудование.Модель
//ГДЕ Оборудование.Производитель НЕ В (ПроизводительНоутбуков)//не работает
ГДЕ ПроизводительНоутбуков is null
СГРУППИРОВАТЬ ПО
Оборудование.ТипОборудования,
Оборудование.Производитель
Вопрос на засыпку: что будет, если по каким-то причинам не окажется ни одной записи в справочнике "Компьютеры", но при этом будут записи в справочнике "Ноутбуки"?
Такие задачи решаются ОБЪЕДИНЕНИЕМ таблиц, а не соединением.
(10) Соединяете Заказано и Отгружено по номенклатуре, в выбранных полях добавляем свое и: Заказано.Количество - Выбор когда есть null Отгружено.Количество Тогда 0 Иначе Отгружено.Количество Конец
И все что НЕ 0 нужная номенклатура