Запросы: Вычесть из одной выборки другую

1. GoKerze 16.06.14 12:31 Сейчас в теме
В поиске ответа на вопрос "Как из одной выборки убрать записи присутствующие во второй выборке" я наткнулся на тему "Разность таблиц в запросе", но она не одарила меня полным пониманием. С вашего позволения в новой теме (тема по ссылке закрыта) приведу готовое решение, с небольшим пояснением для себя из прошлого. (: Может кому еще пригодится.

Текст задания №8:
Найдите производителя, выпускающего компьютеры, но не ноутбуки. Вывести: Производитель


Код, выдающий верный результат:
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Оборудование.Производитель
ПОМЕСТИТЬ ВТКомпьютеры
ИЗ
	Справочник.Компьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.Оборудование КАК Оборудование 
	ПО
	Оборудование.Модель =  Компьютеры.Модель

;

ВЫБРАТЬ РАЗЛИЧНЫЕ
	Оборудование.Производитель
ПОМЕСТИТЬ ВТНоутбуки
ИЗ
	Справочник.Ноутбуки КАК Ноутбуки
	ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.Оборудование КАК Оборудование 
	ПО
	Оборудование.Модель =  Ноутбуки.Модель

;

ВЫБРАТЬ
	Компьютеры.Производитель
ИЗ 
	ВТКомпьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	ВТНоутбуки КАК Ноутбуки
	ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
	Ноутбуки.Производитель is NULL
Показать


Что происходит?
Используется Пакетный Запрос, состоящий из трех частей:

1) Возвращает производителей производящих Компьютеры (А, Б, Е) и помещает

их во временную таблицу "ВТКомпьютеры".
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Оборудование.Производитель
ПОМЕСТИТЬ ВТКомпьютеры
ИЗ
	Справочник.Компьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.Оборудование КАК Оборудование 
	ПО
	Оборудование.Модель =  Компьютеры.Модель
Показать


2) Возвращает производителей производящих Ноутбуки (А, Б, Ц) и помещает их во временную таблицу "ВТНоутбуки".
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Оборудование.Производитель
ПОМЕСТИТЬ ВТНоутбуки
ИЗ
	Справочник.Ноутбуки КАК Ноутбуки
	ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.Оборудование КАК Оборудование 
	ПО
	Оборудование.Модель =  Ноутбуки.Модель
Показать


3) Тут происходит то самое "Необходимо проверить, какие производители производят компьютеры, а затем добавить условие, которое будет проверять, что этих производителей нет среди тех, кто производит ноутбуки".

Если мы выберем все колонки и применим левое соединение к нашим временным таблицам,
ВЫБРАТЬ
	*
ИЗ 
	ВТКомпьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	ВТНоутбуки КАК Ноутбуки
	ПО Компьютеры.Производитель = Ноутбуки.Производитель

то получится таблица:
Производитель 1 | Производитель 2
А               | А
Б               | Б
Е               | NULL

ЛЕВОЕ СОЕДИНЕИЕ в результат запроса включило комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию, и записи из первого источника, для которых не найдено соответствующих условию записей из второго источника. Так появилась строка с производителем Е, которому не нашлось пары (NULL).

Нам осталось только добавить условие в , что мы хотим именно тех у кого нет пары:
ВЫБРАТЬ
	*
ИЗ 
	ВТКомпьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	ВТНоутбуки КАК Ноутбуки
	ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
	Ноутбуки.Производитель is NULL
Показать

Получим:
Производитель 1 | Производитель 2
Е               | NULL

И выбрать нужный столбец:
ВЫБРАТЬ
	Компьютеры.Производитель
ИЗ 
	ВТКомпьютеры КАК Компьютеры
	ЛЕВОЕ СОЕДИНЕНИЕ
	ВТНоутбуки КАК Ноутбуки
	ПО Компьютеры.Производитель = Ноутбуки.Производитель
ГДЕ
	Ноутбуки.Производитель is NULL
Показать

Получим:
Производитель 1
Е


Шпаргалка по соединениям таблиц:

В данном примере использовалось А минус Б (левый столбик, второй сверху).
Anchoret; Gaster; user596529_a-ivashenko60; vakham; mrKHrom; arturec05; AlekSo; cdromscsi; user1036136; Dracarys; Dimon2005; PSKMOL; mlv84; Xershi; Rain88; JinAir7460; Morok; mimv; Pavlmir; Kindman1980; zhurba; Tiger86; +22 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Xershi 1553 25.06.17 23:32 Сейчас в теме
(1) есть решение проще. Готовишь таблицу исключения и затем через "где" вложенным запросом исключаешь из нужной выборки!
корум; PhoenixAOD; +2 Ответить
8. jamirza 18.09.19 10:40 Сейчас в теме
(5) на больших таблицах так будет гораздо дольше
voneska7; +1 Ответить
13. vakham 21 01.09.22 16:12 Сейчас в теме
(5)
(5)

Это так?

ВЫБРАТЬ РАЗЛИЧНЫЕ
	Оборудование.Производитель
	//,Оборудование.ТипОборудования
ИЗ
	Справочник.Компьютеры КАК Компьютеры
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оборудование КАК Оборудование
			ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
				Оборудование.Производитель КАК ПроизводительНоутбуков
			ИЗ
				Справочник.Ноутбуки КАК Ноутбуки
					ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оборудование КАК Оборудование
					ПО Ноутбуки.Модель = Оборудование.Модель
			
			СГРУППИРОВАТЬ ПО
				Оборудование.Производитель) КАК ПроизводителиНоутбуков
			ПО Оборудование.Производитель = ПроизводителиНоутбуков.ПроизводительНоутбуков
		ПО Компьютеры.Модель = Оборудование.Модель
//ГДЕ	Оборудование.Производитель НЕ В (ПроизводительНоутбуков)//не работает
ГДЕ	ПроизводительНоутбуков is null

СГРУППИРОВАТЬ ПО
	Оборудование.ТипОборудования,
	Оборудование.Производитель
Показать
2. platon_ 10 16.06.14 12:43 Сейчас в теме
надо было как статью оформить. :)
voneska7; coty; +2 Ответить
3. JinAir7460 12.06.17 18:45 Сейчас в теме
4. imispb 5 25.06.17 23:05 Сейчас в теме
Шпаргалка помогает. Спасибо.
6. user940969 08.06.18 07:51 Сейчас в теме
Вполне себе жизнеспособный вариант. Пожалуй, возьму на вооружение.
7. Dimon2005 6 07.05.19 15:57 Сейчас в теме
Шпаргалка помогла. Спасибо большое.
9. nomad_irk 79 18.09.19 10:51 Сейчас в теме
Вопрос на засыпку: что будет, если по каким-то причинам не окажется ни одной записи в справочнике "Компьютеры", но при этом будут записи в справочнике "Ноутбуки"?
Такие задачи решаются ОБЪЕДИНЕНИЕМ таблиц, а не соединением.
10. ВасяЧ 11.01.21 14:59 Сейчас в теме
Есть две таблицы "Заказано" и "Отгружено" со столбцами "Номенклатура" и "Количество".

Как получить таблицу "Неотгружено", в которой может быть номенклатура которая неотгружена либо полностью, либо частично?
11. Fox_1n 11.01.21 15:03 Сейчас в теме
(10) Соединяете Заказано и Отгружено по номенклатуре, в выбранных полях добавляем свое и: Заказано.Количество - Выбор когда есть null Отгружено.Количество Тогда 0 Иначе Отгружено.Количество Конец
И все что НЕ 0 нужная номенклатура
user1806897; ВасяЧ; +2 Ответить
12. user654641_yaga_m 13 11.02.21 11:40 Сейчас в теме
Спс, помогло и "мозги" на место встали, а то путалось все...))
14. user596529_a-ivashenko60 17.02.23 15:55 Сейчас в теме
Спасибо автору. Основной вариант решения значительно понятнее чем вариант 13.
15. baranchikov 06.06.24 16:03 Сейчас в теме
Спасибо автору! Шпаргалка помогает.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот