选择仅在映射表中包含单个记录的查询

时间:2017-06-29 14:10:05

标签: sql-server tsql

拜托,有人可以帮我解决一个简单的查询吗?

我们有两个表格结构如下。

Customer表:

+----+-----------+
| id |   name    |
+----+-----------+
|  1 | customer1 |
|  2 | customer2 |
|  3 | customer3 |
+----+-----------+

Customer role映射表:

+-------------+-----------------+
| customer_id | customerRole_id |
+-------------+-----------------+
|           1 |               1 |
|           1 |               2 |
|           2 |               1 |
|           3 |               1 |
|           4 |               1 |
|           5 |               1 |
+-------------+-----------------+

我想选择角色ID为1且不具有角色ID为1 AND 2的客户。

因此,在这种情况下,它将是客户ID 2,3,4& 5.忽略1因为它有多重角色。

是否有简单的查询来执行此操作?

非常感谢,提供任何帮助。

1 个答案:

答案 0 :(得分:2)

嗯,有几种方法可以做到这一点。

select c.*
from customers c
where exists (select 1 from mapping m where m.customerid = c.id and m.role = 1) and
      not exists (select 1 from mapping m where m.customerid = c.id and m.role <> 1);

如果您只想要客户ID,可能更简单的版本是:

select customerid
from mapping
group by customerid
having min(role) = 1 and max(role) = 1;

此解决方案假定role永远不会NULL