Sql 编写此查询的更好方法是什么?
我有以下查询,我试图找出有多少员工分配了部门ID,有多少员工没有分配部门ID(DepartmentID不是外键)Sql 编写此查询的更好方法是什么?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下查询,我试图找出有多少员工分配了部门ID,有多少员工没有分配部门ID(DepartmentID不是外键) 上述查询工作正常,但执行时间太长。我有大约二十万份员工记录和大约4000份部门记录。如果不需要,您可以先避免使用合并功能。我假设-33只是NULL的占位符。因为优化器可以使用索引,所以下面的内容更清楚,也更有效 我将使用EXISTS和no join以这种方式编写它: WITH archive AS ( SELECT CASE WHEN EXISTS(SELECT 1 FROM
上述查询工作正常,但执行时间太长。我有大约二十万份员工记录和大约4000份部门记录。如果不需要,您可以先避免使用
合并功能。我假设-33
只是NULL
的占位符。因为优化器可以使用索引,所以下面的内容更清楚,也更有效
我将使用EXISTS
和no join以这种方式编写它:
WITH archive AS
(
SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.tbl_Department d
WHERE d.DepartmentID = e.DepartmentID)
THEN 'Department Found'
ELSE 'Department Not Found' END AS DepartmentStatus
FROM dbo.tbl_Employee WITH (NOLOCK) e
)
SELECT DepartmentStatus, Count(*) As Cnt
FROM archive
GROUP BY DepartmentStatus
我认为可以改写为:
SELECT CASE WHEN d.DepartmentID IS NULL THEN 'Not Found' ELSE 'Found' END [Status],
COUNT(*) [Count]
FROM dbo.tbl_Employee e
LEFT JOIN dbo.tbl_Department d ON e.DepartmentID = d.DepartmentID
GROUP BY CASE WHEN d.DepartmentID IS NULL THEN 'Not Found' ELSE 'Found' END
几十万员工?那是一家大公司对吧,不管怎样,实际的业务细节必须隐藏起来,所以问题必须从实际的业务场景映射到Emp部门。为什么NOLOCK暗示?您对丢失和/或重复的行是否满意@TimSchmelter,当然,除非某些部门ID
已存储为-33
。(希望不是,但我看到了更糟糕的事情…@Zohar:DepartmentID
不是外键,所以我假设可能存在不一致,DepartmentID
已分配,但在tbl\U部门中不存在。也许OP现在想解决这个问题。
SELECT SUM(CASE WHEN DepartmentID IS NULL THEN 1 ELSE 0 END) AS EmployeesWithNoDepartment
FROM tbl_Department
SELECT CASE WHEN d.DepartmentID IS NULL THEN 'Not Found' ELSE 'Found' END [Status],
COUNT(*) [Count]
FROM dbo.tbl_Employee e
LEFT JOIN dbo.tbl_Department d ON e.DepartmentID = d.DepartmentID
GROUP BY CASE WHEN d.DepartmentID IS NULL THEN 'Not Found' ELSE 'Found' END