2012-08-23 48 views
0

返回记录我所试图实现与不同的或独特的数据在多个领域

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

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

即比方说,记录1包含'85 0.43' 在TEST4 和RECORD2包含'85 0.43' 中的Test2

我不希望它有85年的0.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; 

感谢

+0

一个非常混乱的模式,你正试图完成。你会被允许使用临时表作为解决方案的一部分吗?每个记录还有一个唯一的ID吗? – PinnyM

+0

是的每个记录都有一个唯一的ID,是的,我不熟悉创建临时表,但我会愿意使用任何东西来完成任务。如果有帮助,我在用户定义函数中声明这个查询。 – Trevor

+0

你的意思是标记你的问题'mysql'或'oracle'? 'TIMESTAMPDIFF'不存在于'tsql' – Kermit

回答

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),你可以退出循环。对于非常大的表格,这可能是推荐的方法。

+0

感谢您的帮助。我一定会尝试这个。我不认为会有很多情况下表格会过大。但是,您能否演示如何实现索引?谢谢 – Trevor

+0

更新了示例索引 – PinnyM