【发布时间】:2017-09-17 04:35:16
【问题描述】:
我正在查看我们环境中的现有存储过程,并且我在存储过程中遇到了一个我认为不正确的子查询 - 但我对子查询没有太多经验。
根据这篇 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 上加入 mergeto 字段是没有意义的,我认为一定是一个错误。
实际上,代码应该是这样写的:
c.id NOT IN ( SELECT id from dbo.Customers...)
确保返回正确的记录。子查询不应该这样工作吗?
【问题讨论】:
-
取决于设计您的数据库的人是否尝试将 id 存储在 mergeto 中
-
明白。感谢您的洞察力。它确实有帮助。
标签: sql-server tsql subquery sql-server-2014