SQL Query用于列出所有记录,其中一列的所有值都不在另一列中

时间:2018-02-23 20:37:10

标签: mysql sql database

抱歉这个问题太模糊了。我在这里解释一下。 所以我有两张桌子说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,但我无法找出正确的答案。

帮助将不胜感激。!!!

3 个答案:

答案 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 JOINNOT 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)