Sql server 编写子查询的正确方法

Sql server 编写子查询的正确方法,sql-server,tsql,subquery,sql-server-2014,Sql Server,Tsql,Subquery,Sql Server 2014,我正在审查我们环境中的一个现有存储过程,我在一个存储过程中遇到了一个子查询,我认为这是不正确的,但我没有太多的子查询经验 根据这篇Technet文章,子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择 以确保返回正确的记录。子查询不就是这样工作的吗?我认为查询在这里试图做的是只获取尚未合并到不同客户id的客户的记录。在您的表中,似乎在不同的时间,您为同一个人、同一社会保险号分配了不同的id。这就是为什么查询会提取客户id的记录 谁有相同的社会保险号码,这意味着它是同一个人

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

根据这篇Technet文章,子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择


以确保返回正确的记录。子查询不就是这样工作的吗?

我认为查询在这里试图做的是只获取尚未合并到不同客户id的客户的记录。在您的表中,似乎在不同的时间,您为同一个人、同一社会保险号分配了不同的id。这就是为什么查询会提取客户id的记录

  • 谁有相同的社会保险号码,这意味着它是同一个人
  • 然后,过滤记录以仅获取尚未合并到其他客户id中的记录

  • 因此,这意味着查询试图获取客户的当前客户id,并且仅获取未合并到不同客户id的记录,与社保号相对。

    取决于设计数据库的人员是否尝试将id存储在mergedtoUnderstood中。谢谢你的洞察力。这确实有帮助。
    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
                       )
    
    c.id NOT IN ( SELECT id from dbo.Customers...)