0

テーブルの 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 には誤った記録がありますが、彼にも有効な記録があるため、彼の誤った記録を取得したくありません。

4

1 に答える 1

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 と同じにならないように結合に追加しました。

于 2013-02-01T15:47:14.147 に答える