我们有一个问题,我们的一张表中有 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 有错误记录,我也不想检索他的错误记录,因为他也有有效记录。