我正在审查我们环境中的现有存储过程,并且我在存储过程中遇到了一个我认为不正确的子查询 - 但我对子查询没有太多经验。
根据这篇Technet文章,子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。 Link
SELECT DENSE_RANK() OVER ( ORDER BY c.socialSecurityNumber ) AS [SSNRanking] ,
c.socialSecurityNumber AS [SSN] ,
c.id AS [CustomerID] ,
c2.socialSecurityNumber AS [DupSSN] ,
c2.id AS [DupCustomerID]
FROM dbo.Customers AS [c]
INNER JOIN dbo.Customers AS [c2] ON c.socialSecurityNumber = c2.socialSecurityNumber AND c.id <> c2.id
WHERE c.id NOT IN ( SELECT mergedTo
FROM Customers
WHERE customerStatusTypeID = 'M'
AND isMerged = 1
AND mergedTo IS NOT NULL
)
如果子查询类似于JOIN,那么将c.id连接到mergedto字段是没有意义的,我认为必定是错误。
实际上,应该编写代码:
c.id NOT IN ( SELECT id from dbo.Customers...)
确保返回正确的记录。这不是子查询应该如何工作的吗?
答案 0 :(得分:1)
我认为这里的查询试图只为那些尚未合并到不同客户ID的客户提供这些记录。看来,在您的表格中,在不同的时间,您正在为同一个人,同一社会安全号码分配不同的ID。这就是为什么查询正在获取客户ID的记录
因此,这意味着查询正在尝试获取客户的当前客户ID,并且仅针对社会安全号码获取尚未合并到不同客户ID的记录。