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

时间:2015-06-09 14:55:40

标签: sql sql-server tsql

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

WITH 
archive AS
(SELECT  CASE  COALESCE(tbl_Department.DepartmentID, -33) WHEN -33 THEN 'Department Not Found' ELSE 'Department Found' END  AS DepartmentStatus

FROM dbo.tbl_Employee  
WITH (NOLOCK)

LEFT OUTER JOIN dbo.tbl_Department
 WITH (NOLOCK)
 ON tbl_Employee.DepartmentID = tbl_Department.DepartmentID 
) 

SELECT DepartmentStatus, COUNT(DepartmentStatus) 
FROM archive


GROUP BY DepartmentStatus

上述查询效果很好但执行时间太长。我有大约几十万份员工记录和大约4000份部门记录。

3 个答案:

答案 0 :(得分:2)

如果不需要COALESCE功能,您可以先避开-33功能。我假设NULL只是EXISTS的占位符。以下更清晰,也更有效,因为优化器可以使用索引。

我会用这种方式编写它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 并且根本不用连接:

{{1}}

答案 1 :(得分:0)

    public async Task<long> GetNextObjectSequenceAsync(string objectName)
    {
        var collection = this.Context.GetCollection<ObjectSequence>("Counters");
        var filter = new FilterDefinitionBuilder<ObjectSequence>().Where(x => x.Name == objectName);
        var options = new FindOneAndUpdateOptions<ObjectSequence, ObjectSequence>() { IsUpsert = true };
        var update = new UpdateDefinitionBuilder<ObjectSequence>().Inc(x => x.Sequence, 1);

        ObjectSequence seq = await collection.FindOneAndUpdateAsync<ObjectSequence>(filter, update, options);

        return seq.Sequence;

    }

答案 2 :(得分:0)

我认为它可以改写为:

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