Sql 编写此查询的更好方法是什么?

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

我有以下查询,我试图找出有多少员工分配了部门ID,有多少员工没有分配部门ID(DepartmentID不是外键)


上述查询工作正常,但执行时间太长。我有大约二十万份员工记录和大约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