Tenho o seguinte exemplo de estrutura de dados de cliente que pode fazer parte de vários grupos usando uma tabela de junção e dados:
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);
Preciso obter clientes que tenham grupos específicos dos quais fazem parte e preciso obter uma lista de todos os clientes que fazem parte de pelo menos um grupo em várias listas de grupos. Por exemplo eu quero pegar todos os clientes que estão no grupo (5 OR 6) AND (1 OR 3)
, então por exemplo um cliente nos grupos 5 e 1 seria retornado, mas alguém no grupo 1 e 90 ou apenas no grupo 1 não. Com os dados de amostra fornecidos, obteríamos o cliente com os IDs 0 e 3 apenas se eles estivessem em conformidade com as regras fornecidas acima.
Apenas fazer WHERE group_id IN (5,6) AND group_id IN (1,3)
não parece funcionar, então estou procurando uma alternativa.
Eu tenho isso até agora que funciona:
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);
Resultados esperados:
eu ia |
---|
0 |
3 |
Existe uma maneira de fazer isso com mais desempenho?