确定不销售产品的商店

时间:2019-07-25 00:34:44

标签: sql logic business-logic

我有2个表city_products,其中包含城市中的所有产品,而product_list中包含不同城市中存在的所有产品。我想要每个城市中不可用的产品列表。

[![在此处输入图片描述] [1]] [1]

表1: city_prd

city    product
------  -------
city 1  p1
city 1  p3
city 1  p2
city 2  p1
city 2  p5

表2: pdt_list

product
-------
p1
p2
p3
p4
p5

所需的输出:

city    product
------  -------
city 1  p4
city 1  p5
city 2  p2
city 2  p3
city 2  p4

我知道与交叉联接有关,但是我没有得到确切的答案

2 个答案:

答案 0 :(得分:0)

您没有提到正在使用哪个数据库,所以我将为您提供通用的SQL解决方案。您可以使其适应特定的RDBMS。

select
  c.city, p.product
from (
  select distinct city from city_prd
) c
cross join pdt_list p
except
select city, product from city_prd
order by c.city, p.product

答案 1 :(得分:0)

这是TheImpaler回答的一种变体,但是它应该在所有数据库中都有效。使用cross join生成城市和产品的所有组合。然后使用left join(或类似的机制)删除存在的内容:

select c.city, p.product
from (select distinct city from city_prd) c cross join
     pdt_list p left join
     city_prd cp
     on c.city = cp.city and p.product = cp.product
where cp.city is null;

我还猜测您有一个cities表。您可以改用它:

select c.city, p.product
from cities c cross join
     pdt_list p left join
     city_prd cp
     on c.city = cp.city and p.product = cp.product
where cp.city is null;