2015-11-05 60 views
0

我有一個表,看起來像這樣:表值參數進行過濾的第一場比賽的每一行

id1 | id2 | value | id3 
1 | abc | 23 | apt-1 
1 | abc | 24 | apt-2 
2 | def | 25 | apt-3 
3 | def | 25 | apt-3 

我需要得到高於匹配的表值參數像這樣從表中的第一行:

id1 | id2 | 
1 | abc | 
2 | def | 

我想要的結果是

id1 | id2 | value | id3 
1 | abc | 23 | apt-1 
2 | def | 25 | apt-3 

相反,我回來三排在表中。

id1 | id2 | value | id3 
1 | abc | 23 | apt-1 
1 | abc | 24 | apt-2 
2 | def | 25 | apt-3 

我該如何解決這個問題?這會有什麼效果?對於我們編寫比當前正在讀取的數據更多的數據,這是一個臨時解決方案,但將來也將基於id3進行閱讀。

我們來調用表Foo和tvp tvpInput。

我嘗試以下兩個查詢:

--Approach 1 
SELECT * 
FROM Foo as ret 
INNER JOIN @tvpInput t 
ON 
t.id1 = ret.id1 
AND t.id2 = ret.id2 

--Approach 2 
SELECT * 
FROM Foo AS ret 
WHERE EXISTS 
(
    SELECT t.id1, t.id2 FROM @tvpInput t 
    WHERE 
    ret.id1 = t.id1 
    AND ret.id2 = t.id2  
) 
+0

讓我們來談談1,abc。你如何確定你想要回到哪一排?有2行符合標準。是更低的值?或者,你回到哪一排有什麼關係?有幾種方法可以完成,它在一定程度上取決於這些答案。 –

+0

這是一個很好的觀點。我只想要一個與標準相匹配的標準,它與哪個標準無關。 – ame

回答

0

這裏有一種方法可以做到這一點。還有其他幾種方法可以起作用。

select * 
from 
(
    SELECT *, ROW_NUMBER() over(partition by ret.id1, ret.id2 order by (select newid())) as RowNum 
    FROM Foo as ret 
    INNER JOIN @tvpInput t ON t.id1 = ret.id1 
       AND t.id2 = ret.id2 
) x 
where x.RowNum = 1 
0

如果你想要一個單行您可以使用TOP。請記住,SQL表中沒有隱含的排序,因此您需要指定ORDER BY來接收確定的結果,例如

SELECT TOP 1 f.* 
FROM Foo f 
INNER JOIN @tvpInput t 
ON t.id1 = ret.id1 AND t.id2 = ret.id2 
ORDER BY f.id3 
+0

我想要輸入tvp中所有行匹配id1和id2的第一行。更新初始文章以使其更清晰。 – ame