我有三个表来描述一个企业用来管理在线订单的数据库:
orders
o_id c_id
1 1
2 1
3 2
4 3
5 3
order_items
o_id p_id
1 1
2 2
3 1
3 2
3 8
4 1
4 2
5 8
5 9
customers
c_id name
1 Mark
2 Lisa
3 Sean
我想找到所有配对中的第二个客户已购买了至少一对配对中的第一个客户的所有产品的所有配对客户。我似乎无法弄清楚!我最好的尝试是将orders和order_items作为一个表联接,并将该表与自身交叉联接,以获取购买同一产品的所有对。我似乎无法从那里减少它。
Expected Output
c_id1 c_id2
1 2
1 3
2 3
答案 0 :(得分:1)
您可以为此目的使用自联接。这有助于为每个客户统计产品数量。因此,这定义了具有该信息以及唯一的客户/产品对的CTE:
with ci as (
select c.c_id, o.p_id, count(*) over (partition by c_id) as cnt
from order_items oi join
customers c
on c.o_id = o.o_id
group by c.c_id, o.p_id
)
select ci1.c_id, ci2.c_id
from ci ci1 join
ci ci2
on ci1.p_id = oi2.p_id
group by ci1.c_id, ci2.c_id, ci1.cnt
having count(*) = ci1.cnt;