Tiêu chí tìm kiếm như vậy sẽ không thể sử dụng bất kỳ chỉ mục nào, nhưng nó có thể được thực hiện ...
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
Tương tự, nếu tiêu chí tìm kiếm của bạn nằm trong một bảng khác ...
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
(Bạn cần điền giá trị của N-M
bản thân bạn)
CHỈNH SỬA:
Một cách tiếp cận dài hơi hơn, có thể tạo ra một số sử dụng các chỉ mục ...
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
Nơi bạn có chỉ mục trên từng trường riêng lẻ và nơi bạn mong đợi số lượng kết quả phù hợp tương đối thấp cho từng trường này có thể hoạt động tốt hơn tùy chọn đầu tiên, với chi phí là mã lặp lại rất nhiều.