Sql 在多个字段上返回具有不同或唯一数据的记录

Sql 在多个字段上返回具有不同或唯一数据的记录,sql,advantage-database-server,Sql,Advantage Database Server,我正在努力完成的事情 从表Visit中选择最多两条记录,其中包含过去2年内Test1-Test8字段中的多个代码之一 但这两个记录不能有任何重复的代码 ie假设Record1在Test4中包含“85.43” 而Record2在Test2中包含“85.43” 我不希望它返回Record2,因为已经存在一个带有“85.43”的记录 有人知道我如何做到这一点吗 这里是我的初始查询,它没有内置重复的逻辑 select TOP 2 * from Visit where customer = Custome

我正在努力完成的事情

从表Visit中选择最多两条记录,其中包含过去2年内Test1-Test8字段中的多个代码之一

但这两个记录不能有任何重复的代码

ie假设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;
从客户=客户代码和
(测试1英寸('85.41'、'85.43'、'85.45'、'85.47')
或测试2英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试3英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试4英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试5英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试6英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试7英寸('85.41'、'85.43'、'85.45'、'105.47')
或测试8英寸('85.41','85.43','85.45','105.47'))

和TIMESTAMPDIFF(SQL_TSI_MONTH,DATE_IN,CurrentDate)这是我能想到的最干净的方法,如果直接使用该表,则不需要求助于所有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

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

对于您要完成的任务,这是一个非常混乱的模式。您是否可以使用临时表作为解决方案的一部分?每个记录都有唯一的id吗?是的,每个记录都有唯一的id,是的,我不熟悉创建临时表,但我愿意使用任何东西来完成任务。如果有帮助的话,我将在用户定义的函数中声明此查询。您的意思是标记您的问题
mysql
还是
oracle
TIMESTAMPDIFF
tsql
中不存在好的,我不确定应用了什么。谢谢你的帮助。我一定要试试这个。我不认为会有很多情况下,桌子会太大。但是你能演示一下如何实现索引吗?谢谢
CREATE INDEX some_unique_name_index ON #t (ID, TestField)