0

私が達成しようとしていること

フィールド Test1 ~ Test8 の多数のコードの 1 つを含む表 Visit から最大 2 つのレコードを選択します 過去 2 年以内。

ただし、2 つのレコードに重複するコードを含めることはできません。

つまり、Record1 に Test4 の '85.43' が含まれ、Record2 に Test2 の '85.43' が含まれているとします。

「85.43」のレコードが既に存在するため、Record2 を返したくありません。

どうすればこれを達成できるか知っている人はいますか?

これは、重複するロジックが組み込まれていない最初のクエリです。

select TOP 2 * from Visit where customer = CustomerCode AND
(Test1 IN ('85.41', '85.43', '85.45', '85.47')
or Test2 IN ('85.41', '85.43', '85.45', '105.47')
or Test3 IN ('85.41', '85.43', '85.45', '105.47')
or Test4 IN ('85.41', '85.43', '85.45', '105.47')
or Test5 IN ('85.41', '85.43', '85.45', '105.47')
or Test6 IN ('85.41', '85.43', '85.45', '105.47')
or Test7 IN ('85.41', '85.43', '85.45', '105.47')
or Test8 IN ('85.41', '85.43', '85.45', '105.47'))
AND TIMESTAMPDIFF(SQL_TSI_MONTH, DATE_IN, CurrentDate) <= 24;

ありがとう

4

1 に答える 1

2

これは、テーブルを直接使用する場合に必要となる 64 の比較すべてに頼ることなく、これを行うと考えることができる最もクリーンな方法です。

CREATE TABLE #t (ID int, TestField varchar(255))

INSERT INTO #t SELECT Id, Test1 FROM Visit WHERE customer = CustomerCode AND TIMESTAMPDIFF(SQL_TSI_MONTH, DATE_IN, CurrentDate) <= 24
INSERT INTO #t SELECT Id, Test2 FROM Visit WHERE customer = CustomerCode AND TIMESTAMPDIFF(SQL_TSI_MONTH, DATE_IN, CurrentDate) <= 24
INSERT INTO #t SELECT Id, Test3 FROM Visit WHERE customer = CustomerCode AND TIMESTAMPDIFF(SQL_TSI_MONTH, DATE_IN, CurrentDate) <= 24
... -- repeat for each Test field

SELECT TOP 2 * FROM Visit WHERE Id IN (
  SELECT a.Id FROM #t a
  LEFT JOIN #t b
    ON a.Id > b.Id
    AND a.TestField = b.TestField
  GROUP BY a.Id
  HAVING count(b.TestField) = 0
)
ORDER BY Id

DROP TABLE #t

テーブルのサイズによっては、一時テーブルにインデックスを追加する必要がある場合があります。そうしないと、耐えられないほど遅くなります。

CREATE INDEX some_unique_name_index ON #t (ID, TestField)

これを高速化するもう 1 つの方法は、T-SQL ループを使用して、条件に一致する行を一度に 1 行ずつ検索し、それらを結果テーブルに追加することです。十分な結果 (この場合は 2 つ) が得られたら、ループを終了できます。非常に大きなテーブルの場合、これはおそらく推奨されるアプローチです。

于 2012-08-23T18:47:03.203 に答える