テーブルの 1 つに 100,000 件の誤ったレコードがあるという問題があります。これらの誤ったレコードは、主キーが 10 桁ではなく 8 桁しかないため、簡単に識別できます。
私が直面している問題は、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」に変更すると、不要な 2,000 件のレコードを含む、100,000 件の誤ったレコードがすべて取得されます。
有効なレコードを持たない誤ったレコードをすべて選択する方法を知っている人はいますか?
編集
質問の明確化: エラーのあるレコードと有効なレコードの両方を含む Person_Address テーブルが 1 つだけあります。有効なレコードに対応しない誤ったレコードを見つけたいので、同じ Person_Address テーブルを 2 回選択しています。異なる名前を付けているだけです。
たとえば、John Smith には、1234567HOM (これは有効なレコードです) と 1234567H (これは誤ったレコードです) という 2 つの住所レコードがあります。Judith Roger の有効なレコードは 2222222HOM だけです。Seth Adams には、3333333H という 1 つのエラー レコードしかありません。Seth Adams のレコードのみを取得するクエリを作成したいと考えています。
したがって、John Smith には誤った記録がありますが、彼にも有効な記録があるため、彼の誤った記録を取得したくありません。