[英]List customers who haven't ordered any products that another one has
這三個表是更大的訂單管理系統的一部分:
orders
o_id c_id
1 1
2 1
3 2
4 3
5 3
6 4
7 5
order_items
o_id p_id
1 1
2 2
3 1
3 2
3 8
4 1
4 2
5 8
5 9
6 4
6 5
7 12
customers
c_id name
1 Doug
2 Tammy
3 Bill
4 Don
5 Kate
我想找到一對客戶中的第二個客戶沒有購買該對中的第一個客戶購買的任何產品的所有客戶對。 我似乎無法弄清楚這一點! 我最好的嘗試是獲取所有獨特產品的數量,並嘗試查看是否可以通過利用該數量進行分組和減少。
Expected Output
c_id1 c_id2
4 1
4 2
4 3
4 5
5 1
5 2
5 3
或者正好相反(沒有重復)。
CREATE TABLE orders (
o_id INT,
c_id INT
);
INSERT INTO orders (o_id, c_id) VALUES
(1, 1),
(2, 1),
(3, 2),
(4, 3),
(5, 3),
(6, 4),
(7, 5);
CREATE TABLE order_items (
o_id INT,
p_id INT
);
INSERT INTO order_items (o_id, p_id) VALUES
(1, 1),
(2, 2),
(3, 1),
(3, 2),
(3, 8),
(4, 1),
(4, 2),
(5, 8),
(5, 9),
(6, 4),
(6, 5),
(7, 12);
CREATE TABLE customers (
c_id INT,
name VARCHAR(10)
);
INSERT INTO customers (c_id, name) VALUES
(1, 'Doug'),
(2, 'Tammy'),
(3, 'Bill'),
(4, 'Don'),
(5, 'Kate');
測試
WITH cte AS ( SELECT *
FROM orders
NATURAL JOIN order_items
NATURAL JOIN customers )
SELECT t1.c_id id1, t2.c_id id2
FROM customers t1
JOIN customers t2 ON t1.c_id < t2.c_id
WHERE NOT EXISTS ( SELECT NULL
FROM cte cte1, cte cte2
WHERE cte1.c_id = t1.c_id
AND cte2.c_id = t2.c_id
AND cte1.p_id = cte2.p_id );
這個想法是生成所有客戶對(使用cross join
)。
然后檢查它們是否具有相同的項目。 這有點棘手,但它涉及not exists
並連接到項目級別以查看與客戶匹配的訂單是否有任何匹配:
select c1.c_id, c2.c_id
from customers c1 cross join
customers c2
where not exists (select 1
from order_items oi1 join
order_items oi2
on oi1.i_id = oi2.i_id join
orders o1
on o1.o_id = oi1.o_id join
orders o2
on o2.o_id = oi2.o_id
where o1.c_id = c1.c_id and
o2.c_id = o2.c_id
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.