我有以下客户的示例数据结构,它可以使用连接表和数据成为多个组的一部分:
CREATE TABLE customer(id) AS VALUES (0),(1),(2),(3);
CREATE TABLE groups(id) AS VALUES (1),(3),(5),(6);
CREATE TABLE customers_to_groups(customer_id, group_id) AS
VALUES (0, 1)--customer 0 is in group (5 OR 6) AND (1 OR 3)
,(0, 5)--customer 0 is in group (5 OR 6) AND (1 OR 3)
,(1, 1)
,(1, 90)
,(2, 1)
,(3, 3)--customer 3 is in group (5 OR 6) AND (1 OR 3)
,(3, 5)--customer 3 is in group (5 OR 6) AND (1 OR 3)
,(3, 90);
我需要获取属于特定组的客户,并且需要获取属于多个组列表中至少 1 个组的所有客户列表。例如,我想获取组中所有客户(5 OR 6) AND (1 OR 3)
,因此例如组 5 和 1 中的客户将被返回,但组 1 和 90 或仅组 1 中的客户则不会被返回。使用提供的样本数据,我们将仅获取 ID 为 0 和 3 的客户,因为它们符合上述给定的规则。
仅仅这样做WHERE group_id IN (5,6) AND group_id IN (1,3)
似乎不起作用,所以我正在寻找替代方案。
到目前为止我得到了这个有效的方法:
SELECT DISTINCT c.id
FROM customer c
INNER JOIN customers_to_groups at1 ON c.id = at1.customer_id
INNER JOIN customers_to_groups at2 ON c.id = at2.customer_id
WHERE at1.group_id IN (5, 6)
AND at2.group_id IN (1, 3);
预期成绩:
ID |
---|
0 |
3 |
有没有更有效的方法来实现这一点?