如何在不使用子查询的情况下选择具有条件的不同记录

时间:2017-07-31 09:26:46

标签: mysql sql sql-server database

我有一个包含以下架构的表

(Id(int PK),EmployeeId(int),DepartmentId(int),IsSelfAccessToDepartment(bit))

此表可包含以下条目

(1,101,21,1)
(2,101,22,0)
(3,102,21,1)
(4,103,21,1)
(5,103,22,0)

我想只检索那些IsSelfAccessToDepartment = 1的员工ID,即如果同一员工Id有另一个条目,其中IsSelfAccessToDepartment = 0,在这种情况下不应检索此行。

问题是我想在不使用任何子查询和连接的情况下检索此信息,因为它会产生性能问题,因为此表将有数百万个条目。

3 个答案:

答案 0 :(得分:1)

应使用最小功能过滤掉所有输入0的员工。 还应利用最大函数将条目限制为不高于1.

SELECT employeeID, MIN(IsSelfAccessToDepartment) FROM test2 GROUP BY employeeID
HAVING MIN(isSelfAccessToDepartment) = 1;

最后:

  • 不需要计数,因为这不是OP
  • 要求的要求
  • 如果AND MAX(isSelfAccessToDepartment) = 1不是一点,则可以添加代码IsSelfAccessToDepartment。但是,由于它有点,两个可用值为零和一(感谢@Caius在评论中的这一点)。

此外,还有其他创意解决方案(但效率低下),例如:

SELECT employeeID FROM test2 GROUP BY employeeID
HAVING SUM(isSelfAccessToDepartment) = COUNT(isSelfAccessToDepartment);

这假设isSelfAccessToDepartment可以为零或1.如果不存在零条目,则总和将与计数相同。

答案 1 :(得分:0)

这样的东西适用于MySQL或SQLServer:

SELECT employeeID FROM table GROUP BY employeeID
HAVING MIN(IsSelfAccessToDepartment) = 1 AND MAX(IsSelfAccessToDepartment) = 1

只能获得员工ID;如果需要,可以添加部门ID。实际上,你最终会加入这些信息以获得有用的信息。另外,从您的示例中可以清楚地看出,在员工有3行

的情况下,您的期望是什么

我已经使用了ROW_NUMBER()OVER()但MySQL不支持它。

请正确标记您的问题以反映您正在使用的数据库

答案 2 :(得分:0)

如果您的DBMS是MySQL

简单的GROUP BY HAVINGCOUNT执行此操作

SELECT Id, EmployeeID, DepartmentId, IsSelfAccessToDepartment
FROM yourtable
GROUP BY EmployeeId
HAVING IsSelfAccessToDepartment = 1
AND COUNT(EmployeeID) = 1

输出

Id  EmployeeID  DepartmentId    IsSelfAccessToDepartment
3   102         21              1

SQL小提琴:docs

如果您的DBMS是SQL Server

SELECT MIN(Id) AS Id, EmployeeID, MIN(DepartmentId) AS DepartmentId, MIN(IsSelfAccessToDepartment) AS IsSelfAccessToDepartment
FROM yourtable
GROUP BY EmployeeId
HAVING MIN(IsSelfAccessToDepartment) = 1
AND COUNT(EmployeeID) = 1

输出

Id  EmployeeID  DepartmentId    IsSelfAccessToDepartment
3   102         21              1

SQL小提琴:http://sqlfiddle.com/#!9/7a75b8/1/0