私は以下のテーブルを持っています - テーブルには顧客キーとロールが設定されています。各顧客キーには複数の異なるロールが関連付けられていて、特定のロールのリストで顧客キーを識別できるようにしたいと考えています。たとえば、すべてのアカウントをロール(「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 |
+--------------+------------+----+
私は2つの役割までのアカウントを特定するには、以下のクエリを使用して成功を収めてきました:
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