我有一个包含以下架构的表
(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,在这种情况下不应检索此行。
问题是我想在不使用任何子查询和连接的情况下检索此信息,因为它会产生性能问题,因为此表将有数百万个条目。
答案 0 :(得分:1)
应使用最小功能过滤掉所有输入0的员工。 还应利用最大函数将条目限制为不高于1.
SELECT employeeID, MIN(IsSelfAccessToDepartment) FROM test2 GROUP BY employeeID
HAVING MIN(isSelfAccessToDepartment) = 1;
最后:
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
HAVING
和COUNT
执行此操作
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