Извините, вопрос слишком расплывчатый. Я объясню это здесь. Итак, у меня есть две таблицы: R и S.
Есть 10 продуктов P1, P2............... P10, и каждый продукт может иметь 5 типов T1, T2, T3, T4, T5.
Таблица R представляет собой таблицу с двумя столбцами, которая сортируется по продуктам.
Products Type
P1 T1
P1 T3
P1 T4
P2 T2
P2 T3
P3 T1
. .
. .
. .
Таким образом, R - это таблица, которая сортируется по продуктам и описывает, какой тип каждого продукта из пяти доступен.
S - другая таблица всех 5 типов.
Type
T1
T2
T3
T4
T5
Мне нужно узнать List из всех типов, которые недоступны для определенного продукта.
Таким образом, результат должен быть:
Products Type
P1 T2
P1 T5
P2 T1
P2 T4
P2 T5
. .
. .
. .
. .
SInce P1 не имеет T2 и T5 в таблице R, он должен быть включен в результат.
Как я могу это достичь? Я пробовал использовать Left Join, но я не могу найти правильный ответ.
Помощь будет оценена. !!!
Вы используете cross join
для генерации всех строк, а затем отфильтровываете те, которые существуют:
select p.product, t.type
from (select distinct product from producttypes) p cross join
types t left join
producttypes pt
on pt.product = p.product and pt.type = t.type
where pt.type is null;
Конечно, если у вас есть таблица со всеми продуктами, вы можете использовать ее для p
вместо подзапроса.
create table product(
product_id varchar(10) not null,
product_type varchar(10) not null
);
go
insert into product values
('P1','T1'),
('P1','T3'),
('P1','T4'),
('P2','T2'),
('P2','T3'),
('P3','T1');
go
create table productType(
type_id varchar(10) not null,
);
go
insert into productType values
('T1'),('T2'),('T3'),('T4'),('T5'),('T6'),('T7')
select * from product
select *
from
(select distinct(product_id) from product) as a
cross join
(select distinct(type_id) from productType) as b
except (select * from product)
Я бы использовал CROSS JOIN
и NOT EXISTS
select DR.product,
S.type
from (select distinct product from R) DR
cross join types S
where not exists (
select 1
from R
where R.product = DR.product and
R.type = S.type
)