我有以下查询,我试图找出有多少员工分配了部门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份部门记录。
答案 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