背景问题
准备数据:
create table items(
item varchar(100) not null -- 商品
);
insert into items(item)
values('啤酒'),
('纸尿裤'),
('自行车');
/*
item
--------
啤酒
纸尿裤
自行车
(3 rows)
*/
create table shop_items(
shop varchar(100) not null, -- 店铺
item varchar(100) not null -- 商品
);
insert into shop_items(shop, item)
values('仙台', '啤酒'),
('仙台', '纸尿裤'),
('仙台', '自行车'),
('仙台', '窗帘'),
('东京', '啤酒'),
('东京', '纸尿裤'),
('东京', '自行车'),
('大阪', '电视'),
('大阪', '纸尿裤'),
('大阪', '自行车');
/*
shop | item
------+--------
仙台 | 啤酒
仙台 | 纸尿裤
仙台 | 自行车
仙台 | 窗帘
东京 | 啤酒
东京 | 纸尿裤
东京 | 自行车
大阪 | 电视
大阪 | 纸尿裤
大阪 | 自行车
*/
问题:
- 找出包含所有类型商品的店铺;
- 找出所有仅包含items表中商品的店铺;
问题一的解法
-- 法一: 使用内连接 select si.shop from shop_items si, items i where si.item = i.item group by si.shop having count(si.item) = (select count(*) from items); -- 法二: select shop from shop_items where item = any (select item from items) group by shop having count(distinct item) = (select count(*) from items); /* 🤔感觉上方法一更加简洁 */
问题二解法:
select si.shop from shop_items si left outer join items i on si.item = i.item group by si.shop having count(si.item) = count(i.item); /* 🤓 这里利用了count(col_name)会过滤掉null的特性 */