我有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
我知道与交叉联接有关,但是我没有得到确切的答案
答案 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;