2012-08-23 46 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