我正在编辑SQL查询,并遇到了一个大致类似于以下内容的部分:
SELECT
userAddress, employeeAddress, userSSNumber,
employeeSSNumber, customerSSNumber, userID, employeeWorkHours,
YTDHoursWorked, employeeHireDate
FROM
Users
LEFT OUTER JOIN
Customers ON customerSSNumber = userSSNumber
LEFT OUTER JOIN
(SELECT
employeeAddress AS Address,
ISNULL((SELECT SUM(employeeWorkHours)
FROM Employees AS TempLines
WHERE TempLines.employeeSSNumber = Employees.employeeSSNumber
AND Templines.employeeHireDate < Employees.employeeHireDate), 0) AS YTDHoursWorked
FROM
Employees) AS Records ON employeeAddress = Address
我怀疑那些部分
where TempLines.employeeSSNumber= Employees.employeeSSNumber
和
on employeeAddress = Address
完全是多余的。如果我理解正确,他们只是将值与自身进行比较,如果删除这些位,查询将返回相同的结果 - 是吗?
而且,
Templines.employeeHireDate < Employees.employeeHireDate
部分会导致嵌套最多的Select根本不返回任何结果,对吗?
请原谅我的示例中任何不一致的大小写,以及表的糟糕设计和命名约定。由于许多这些可能冗余的部分,实际查询的时间要长得多。它使用这些命名约定,我无法更改任何表或字段。这个问题的一部分是在盯着页面长时间查询几个小时后进行的健全性检查。
答案 0 :(得分:2)
条款&#34; TempLines.employeeSSNumber = Employees.employeeSSNumber&#34;是相关子查询的一部分。它确保该行的总和仅用于给定的行。