테이블이 아래 있습니다 - 테이블에 고객 키와 역할이 채워져 있습니다. 각 고객 키에는 연관된 여러 역할이있을 수 있으며 특정 역할 목록으로 고객 키를 식별 할 수 있기를 원합니다. 예를 들어 모든 역할 ("A", "B", "C")을 가진 계정을 식별 할 수 있기를 원합니다.Microsoft SQL Server 2014 - 자체 가입으로 데카르트 결과를 방지 할 수 없습니다.
+--------------+------------+----+
| customer_key | sales_role | |
+--------------+------------+----+
| 123 | A | |
| 123 | B | |
| 123 | C | |
| 456 | A | |
| 456 | B | |
| 789 | A | |
| 789 | B | |
| 789 | C | |
| 987 | A | |
| 987 | B | |
| 987 | C | |
| 987 | D | |
| 654 | E | |
| 654 | F | |
| | Te<br />st | 45 |
+--------------+------------+----+
내가 성공이 역할에 계정을 확인하기 위해 아래 쿼리를 사용 했어 :
SELECT
c.customer_key
,COUNT(c.sales_role) as 'count'
FROM
table a
INNER JOIN table b ON a.customer_key=b.customer_key
RIGHT JOIN table c ON c.customer_key=a.customer_key
WHERE
a.sales_role = 'A' AND
b.sales_role = 'B'
GROUP BY c.customer_key
HAVING
COUNT(c.sales_role) = 2
가 위의 쿼리가 '456'customer_key 내게 줄 것이다.
그러나 아래 쿼리로 더 많은 역할을 식별하기 위해 더 많은 조인을 추가하려고하면 데카르트 제품이 생깁니다.
SELECT
e.customer_key
,COUNT(e.sales_role) as 'count'
FROM
table a
INNER JOIN table b ON a.customer_key=b.customer_key
INNER JOIN table c ON a.customer_key=c.customer_key
INNER JOIN table d ON a.customer_key=d.customer_key
RIGHT JOIN table e ON e.customer_key=a.customer_key
WHERE
a.sales_role = 'A'
AND b.sales_role = 'B'
AND c.sales_role = 'C'
GROUP BY e.customer_key
HAVING
COUNT(e.sales_role) = 3
여기에 어떤 다른 도움을 주어야할지 모르겠다.
대단히 감사합니다. 트릭을 완료 한 것으로 보입니다. 쿼리의 NOT EXISTS 부분을 설명해 주시겠습니까? – raidboss
물론입니다. 특정 customer_key 값이 찾고있는 판매 역할과 일치하는 것으로 확인되면 NOT EXISTS 내의 쿼리는 해당 고객에게 할당 된 다른 판매 역할이 있는지 확인합니다. NOT EXISTS()는 해당 쿼리에서 아무것도 발견되지 않으면 TRUE를 반환하고 해당 쿼리와 일치하는 행이 있으면 FALSE를 반환합니다. "이 쿼리에서 행이 반환되지 않으면 TRUE를보고하고 그렇지 않으면 FALSE를보고합니다"와 같이 읽을 수 있습니다. –
매우 철저한 설명, 다시 한 번 감사드립니다 :) – raidboss