编写子查询的正确方法

时间:2017-09-17 04:35:17

标签: sql-server tsql subquery sql-server-2014

我正在审查我们环境中的现有存储过程,并且我在存储过程中遇到了一个我认为不正确的子查询 - 但我对子查询没有太多经验。

根据这篇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...)

确保返回正确的记录。这不是子查询应该如何工作的吗?

1 个答案:

答案 0 :(得分:1)

我认为这里的查询试图只为那些尚未合并到不同客户ID的客户提供这些记录。看来,在您的表格中,在不同的时间,您正在为同一个人,同一社会安全号码分配不同的ID。这就是为什么查询正在获取客户ID的记录

  1. 谁拥有相同的社会安全号码,这意味着它是同一个人。
  2. 然后,过滤记录以仅获取尚未合并到不同客户ID的记录。
  3. 因此,这意味着查询正在尝试获取客户的当前客户ID,并且仅针对社会安全号码获取尚未合并到不同客户ID的记录。