5

私はかなり長い間これに苦労してきましたが、理解できません。

3列のテーブルがあります。名前を含む 2 つの列と、それらの名前の間のダメラウ レーベンシュタイン距離 ( http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance ) を含む 3 つ目の列。

各列にはすべての単一の名前が含まれています。つまり、autor1 列に存在するすべての名前が autor2 列にも存在します。その結果、autor1 列と autor2 列が入れ替わっただけで、必要な行が 2 倍になりました。

例として、行 3 は行 1 と同じで、autor 列が交換されているだけです。同じことが 2-4 にも当てはまります。これらの「重複」を省略したクエリを作成するにはどうすればよいですか?
id-|------autor1----|------autor2-----| dld
1 -| アベル、グスタフ -| ギュスターヴ・アベル | 1
2 -| アベル、グスタフ -| グスタフ・アベレ | 1
3 -| アベル、ギュスターヴ| アベル、グスタフ --| 1
4 -| グスタフ・アベレ | アベル、グスタフ -| 1


|------autor1----|------autor2-----|へ dld
| アベル、グスタフ -| ギュスターヴ・アベル | 1
| アベル、グスタフ -| グスタフ・アベレ | 1

4

1 に答える 1

10

NOT EXISTS私が知っているすべての DBMS で動作します。これの複雑さは、節を含めることを忘れないことidです。それがなければ、何も返されません。

SELECT *
FROM   YourTable yto
WHERE  NOT EXISTS (
         SELECT  *
         FROM    YourTable yti
         WHERE   yti.autor2 = yto.autor1
                 AND yti.id > yto.id
       )

編集

以下は、ステートメントの背後にあるロジックの内訳です。

  1. 最初のレコードを取得 ( ID = 1)
  2. ID > 1and (はい、ID 3)の記録はありますかautor1 = autor2->無視
  3. 次のレコードを取得 ( ID = 2)
  4. ID > 2and (はい、ID 4)の記録はありますかautor1 = autor2->無視
  5. 次のレコードを取得 ( ID = 3)
  6. どこにレコードがID > 3ありますかautor1 = autor2(いいえ) ->含める
  7. 次のレコードを取得 ( ID = 4)
  8. どこにレコードがID > 4ありますかautor1 = autor2(いいえ) ->含める
于 2012-05-07T12:31:16.207 に答える