0

我想要完成的事情

从表访问中选择最多两条记录,这些记录在过去 2 年内包含字段 Test1-Test8 中的多个代码之一。

但是这两条记录不能有任何重复的代码。

即假设 Record1 在 Test4 中包含“85.43”,Record2 在 Test2 中包含“85.43”

我不希望它返回 Record2,因为“85.43”的记录已经存在。

有谁知道我怎么能做到这一点?

这是我的初始查询,其中没有内置重复的逻辑。

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)

加快此速度的另一种替代方法是使用 T-SQL 循环一次查找与条件匹配的一行并将它们添加到结果表中。一旦你有足够的结果(在本例中为 2 个),你就可以退出循环。对于非常大的表,这可能是推荐的方法。

于 2012-08-23T18:47:03.203 回答