抱歉这个问题太模糊了。我在这里解释一下。
所以我有两张桌子说R和S.
有10个产品P1,P2 ............... P10,每个产品可以有5种类型T1,T2,T3,T4,T5。
表R是一个2列表,根据产品进行分类。
Products Type
P1 T1
P1 T3
P1 T4
P2 T2
P2 T3
P3 T1
. .
. .
. .
所以R是一个按产品分类的表格,描述了五种产品中可用的每种产品的类型 S是列出的所有5种类型的另一个表。
Type
T1
T2
T3
T4
T5
我需要找出所有特定产品无法使用的类型。
所以结果应该是:
Products Type
P1 T2
P1 T5
P2 T1
P2 T4
P2 T5
. .
. .
. .
. .
SInce P1在表R中没有T2和T5,它应该包含在结果中。
我怎样才能做到这一点?我尝试过使用Left Join,但我无法找出正确的答案。
帮助将不胜感激。!!!
答案 0 :(得分:1)
您使用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
而不是子查询。
答案 1 :(得分:0)
我会使用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
)
答案 2 :(得分:0)
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)