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

时间:2013-02-01 15:44:36

标签: sql sql-server not-exists

我们遇到一个问题,我们在其中一张表中有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记录的查询。

所以即使约翰史密斯有错误的记录,我也不想找回他的错误记录,因为他也有一个有效的记录。

1 个答案:

答案 0 :(得分:0)

您希望记录与地址表不匹配。试试这个:

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与错误的记录ID不同。