sql >> データベース >  >> RDS >> PostgreSQL

SQLでほぼ同様のレコードを見つける方法は?

    このような検索条件では、インデックスを使用できませんが、使用することはできます...

    SELECT
      *
    FROM
      yourTable
    WHERE
      N-M <= CASE WHEN yourTable.field1 = searchValue1 THEN 1 ELSE 0 END
           + CASE WHEN yourTable.field2 = searchValue2 THEN 1 ELSE 0 END
           + CASE WHEN yourTable.field3 = searchValue3 THEN 1 ELSE 0 END
           ...
           + CASE WHEN yourTable.fieldN = searchValueN THEN 1 ELSE 0 END
    

    同様に、検索条件が別のテーブルにある場合...

    SELECT
      *
    FROM
      yourTable
    INNER JOIN
      search
        ON N-M <= CASE WHEN yourTable.field1 = search.field1 THEN 1 ELSE 0 END
                + CASE WHEN yourTable.field2 = search.field2 THEN 1 ELSE 0 END
                + CASE WHEN yourTable.field3 = search.field3 THEN 1 ELSE 0 END
                ...
                + CASE WHEN yourTable.fieldN = search.fieldN THEN 1 ELSE 0 END
    

    N-Mの値を入力する必要があります 自分)

    編集:

    より長く曲がりくねったアプローチ、それはいくつかを作ることができます インデックスの使用...

    SELECT
        id,  -- your table would need to have a primary key / identity column
        MAX(field1)   AS field1,
        MAX(field2)   AS field2,
        MAX(field3)   AS field3,
        ...
        MAX(fieldN)   AS fieldN
    FROM
    (
        SELECT * FROM yourTable WHERE field1 = searchValue1
        UNION ALL
        SELECT * FROM yourTable WHERE field2 = searchValue2
        UNION ALL
        SELECT * FROM yourTable WHERE field3 = searchValue3
        ...
        SELECT * FROM yourTable WHERE fieldN = searchValueN
    )
        AS unioned_seeks
    GROUP BY
        id
    HAVING
        COUNT(*) >= N-M
    

    各フィールドに個別にインデックスがあり、各フィールドの一致数が比較的少ないと予想される場合、これは可能性があります 非常に反復的なコードを犠牲にして、最初のオプションよりもパフォーマンスが優れています。



    1. Spotlight Tuning Pack Basic:最高の無料SQL最適化ツール

    2. Oracle MERGE:NOTMATCHEDのみがトリガーされます

    3. OracleConnection.OpenがORA-12541TNSをスローしていますリスナーがありません

    4. sql-oracle-特定のグループ/SKUの最初と最後のレコードを選択する