簡體   English   中英

列出尚未訂購任何其他產品的客戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM