2015-03-31 61 views
0

我想写一个SQL语句,将搜索表的职责分离的问题。在我的表中有一个用户列和一个责任列。我想要吸引所有有两个定义职责的用户。这是我正在尝试,但它不起作用:责任分离搜索

SELECT Users.[User], Users.[Responsibility] 
    FROM Users 
WHERE Users.[Responsibility]="Example A" 
    And Users.[Responsibility]="Example B"; 

有什么建议吗?我认为它不起作用,因为它不是基于用户的责任,但我不知道如何解决这个问题。

+1

它不工作含糊不清。你期望看到什么?以及你的表中有哪些数据,有些例子会有所帮助 – btevfik 2015-03-31 21:08:25

+0

请问你能否在你的问题中包含表格定义?包括唯一约束等。 – 2015-03-31 21:11:04

+0

当有用户拥有示例A和示例B时,它不会返回任何结果。我希望结果只是同时在查询中定义职责的用户。在表中,如果用户有多个责任,列出的用户不止一次。 – Daniel 2015-03-31 21:12:59

回答

3

下面的查询将返回其所有用户的列表都'Example A''Example B'作为他们Responsibility

SELECT Users.[User] 
FROM Users 
GROUP BY [User] 
HAVING COUNT(CASE WHEN [Responsibility]='Example A' THEN 1 END) >= 1 AND 
     COUNT(CASE WHEN [Responsibility]='Example B' THEN 1 END) >= 1 

SQL Fiddle Demo here

如果你想获得的所有用户具有至少两个不同的责任(不管是哪个),然后用HAVING替代:

HAVING COUNT(DISTINCT [Responsibility]) >= 2 

编辑:

使用MS-Access的以下查询:

SELECT User 
FROM Users 
GROUP BY User 
HAVING SUM(IIF(Responsibility = "Example A", 1, 0)) >=1 
     AND SUM(IIF(Responsibility = "Example B", 1, 0)) >= 1 
+0

我在查询表达式'COUNT(CASE WHEN [Responsibility] =“示例A”THEN 1 END)> = 1 AND COUNT(CASE WHEN [Responsibility] =“Example B”)中出现错误,显示为“语法错误THEN 1 END)> = 1。' – Daniel 2015-03-31 21:26:46

+0

@Daniel您使用的是什么RDBMS? – 2015-03-31 21:27:27

+0

它突出显示第一个WHEN为错误 – Daniel 2015-03-31 21:28:00

0

查询其实很简单:

select u.User 
from Users u 
where u.Responsibility in('Example A', 'Example B') 
group by u.User 
having count(*) > 1; 

您的尝试没有成功,因为有“示例A”“示例B”的任何用户都没有任何一行。所以你必须检查'例子A'或'例子B'然后计算结果。

当然,这里假定相同的责任不会被同一用户多次列出。