SQL Server 选择没有匹配的有效记录的错误记录

Posted

技术标签:

【中文标题】SQL Server 选择没有匹配的有效记录的错误记录【英文标题】:SQL Server Select erroneous records that do not have a matching valid record 【发布时间】:2013-02-01 15:44:36 【问题描述】:

我们的一个表中有 100,000 条错误记录。这些错误记录很容易识别,因为它们的主键只有 8 位而不是 10 位长。

我遇到的问题是有 2,000 条有效记录具有匹配的错误记录(即一个人有一个有效的地址记录和一个错误的地址记录)。因此,我只想选择没有匹配有效记录的错误记录。

例如,一个人的地址记录包含该人的 ID 及其地址类型。因此,有效记录的主键为1234567HOM,表示此人的家庭住址。错误记录的主键为1234567H(请理解,我们遇到此问题的真实表不是地址表。我正在使用地址表示例来保护我们的信息。)

因此,我能够使用以下 SQL 选择所有也具有有效记录的错误记录:

SELECT ERRONEOUS.PERSON_ADDRESS_ID
  FROM PERSON_ADDRESS AS ERRONEOUS
  LEFT OUTER JOIN PERSON_ADDRESS AS VALID
    ON LEFT(ERRONEOUS.PERSON_ADDRESS_ID, 8) = LEFT(VALID.PERSON_ADDRESS_ID, 8)
 WHERE LEN(VALID.PERSON_ADDRESS_ID) = 10
   AND LEN(ERRONEOUS.PERSON_ADDRESS_ID) = 8

这为我们提供了 2,000 条错误记录的列表,这些记录也具有有效记录。然而,我们真正需要的是一个没有有效记录的错误记录列表。我试图通过在代码中添加NOT EXISTS 来获取它们:

SELECT PERSON_ADDRESS_ID
  FROM PERSON_ADDRESS
 WHERE LEN(PERSON_ADDRESS_ID) = 8
   AND NOT EXISTS
       (SELECT ERRONEOUS.PERSON_ADDRESS_ID
          FROM PERSON_ADDRESS AS ERRONEOUS
          LEFT OUTER JOIN PERSON_ADDRESS AS VALID
            ON LEFT(ERRONEOUS.PERSON_ADDRESS_ID, 8) = LEFT(VALID.PERSON_ADDRESS_ID, 8)
         WHERE LEN(VALID.PERSON_ADDRESS_ID) = 10
           AND LEN(ERRONEOUS.PERSON_ADDRESS_ID) = 8
       )

不幸的是,这完全没有为我提供任何记录。如果我将“AND NOT EXISTS”更改为“AND EXISTS”,我会得到所有 100,000 条错误记录,包括我不想要的 2,000 条记录。

有谁知道我如何选择所有没有有效记录的错误记录?

编辑

澄清问题:只有一张 Person_Address 表,其中包含错误记录和有效记录。我选择了同一个 Person_Address 表两次,只是给它不同的名称,因为我想找到与有效记录不对应的错误记录。

例如,John Smith 有两条地址记录,1234567HOM(这是一条有效记录)和 1234567H(这是一条错误记录)。 Judith Roger 只有一个有效记录 2222222HOM。赛斯亚当斯只有一个错误记录,3333333H。我想创建一个只检索 Seth Adams 记录的查询。

因此,即使 John Smith 有错误记录,我也不想检索他的错误记录,因为他也有有效记录。

【问题讨论】:

【参考方案1】:

您想要与地址表不匹配的记录。试试这个:

SELECT ERRONEOUS.PERSON_ADDRESS_ID
FROM PERSON_ADDRESS ERRONEOUS LEFT OUTER JOIN
     PERSON_ADDRESS VALID
     ON LEFT(ERRONEOUS.PERSON_ADDRESS_ID, 8) = LEFT(VALID.PERSON_ADDRESS_ID, 8) and
        ERRONEOUS.PERSON_ADDRESS_ID <> VALID.PERSON_ADDRESS_ID
WHERE valid.Person_Address_Id is null and
     LEN(ERRONEOUS.PERSON_ADDRESS_ID) = 8

您的查询的问题是您在where 子句中有地址表。这会取消left outer join 的效果。另外,我添加到联接中,以便有效的记录 id 与错误的记录不同。

【讨论】:

感谢您的快速回复,但不幸的是,该查询返回零结果。 @trice 。 . .我认为问题在于您的数据。如果这没有产生结果,那么所有 8 个字符的人员地址 ID 都存在于有效表中。 我认为我的问题可能有点令人困惑。请让我澄清一下。只有一张 Person_Address 表,其中包含错误记录和有效记录。我选择了同一个 Person_Address 表两次,只是给它不同的名称,因为我想找到与有效记录不对应的错误记录。例如,John Smith 有两个地址记录,1234567HOM 和 1234567H。 Judith Roger 只有一个有效记录 2222222HOM。赛斯亚当斯只有一个错误记录,3333333H。我想创建一个只检索 Seth Adams 记录的查询。 @trice 。 . .这种澄清很有帮助。查看修改后的查询。

以上是关于SQL Server 选择没有匹配的有效记录的错误记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询仅在没有变量为空时才有效

查询匹配列表 SQL Server 中的所有记录

SQL SERVER 性能优化

sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。

SQL Server 2014 - 如何选择字段中没有数值的行?

SQL Server不是有效的安装文件夹,如何修复位置