【问题标题】:Correct way to write a sub-query编写子查询的正确方法
【发布时间】: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


【解决方案1】:

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

  1. 社保号相同,就是同一个人。
  2. 然后,过滤记录以仅获取那些尚未合并到不同客户 ID 中的记录。

因此,这意味着查询正在尝试获取客户的当前客户 ID,并且仅针对社会安全号码获取尚未合并到不同客户 ID 的记录。

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2021-11-25
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多