2014-01-30 70 views
1

這是我的選擇查詢:選擇查詢具有鮮明的上一米田

SELECT 
[T1].[Id], [T2].[Id] , [T3].[Id] 
FROM [T1] 
INNER JOIN [T2] On [T1].[Id] = [T2].[T1Id] 
INNER JOIN [T3] On [T2].[Id] = [T3].[T2Id] 

結果是:

1 1 1 
1 2 2 
1 2 3 
2 3 4 
2 3 5 
3 4 1 

但我需要的是[T1].[Id]事情是這樣的不同:

1 1 1 
2 3 4 
3 4 1 

這是不重要的第一個記錄的Id返回,所以結果可能是:

1 2 2 
2 3 4 
3 4 1 

,但重要的是,每條記錄的列有一個邏輯關係,所以我不能使用MinMax功能。我認爲的第一個解決方案是將值插入臨時表並刪除重複項。

但我認爲這必須是更好的方法?在選擇查詢中的東西。

有沒有人有這方面的想法?

+0

你要哪的1行的? '1 1 1','1 2 2'還是'1 2 3'?更重要的是,爲什麼? (也就是說,不要說「第一個」,比如說「第三列最高的那個,或者可以通過程序檢查的東西) –

+0

正如Lasse所說的,在數據​​庫方面,返回哪些數據總是很重要。即使你不在意,你也需要知道爲什麼。基本上,如果它返回1,1,1或1,2,3並不重要,那麼爲什麼它會返回第二個和第三個值所有,因爲你無法從中提取可靠的數據?除非你只是檢查T1是否被T2和T3引用,這也是必要的信息,可以影響這裏的規格:) – Kahn

+0

@ LasseV.Karlsen我得到你說的是什麼,但是假設我只需要T1,T2,T3之間的關係,這很重要,不是哪個關係。 –

回答

1

試試這個: -

Select 
ID1,ID2,ID3 
from 
(
    SELECT 
     [T1].[Id], [T2].[Id] , [T3].[Id] , 
     rn = ROW_NUMBER() OVER(partition by [T1].[ID] order by [T1].[ID]) 
    FROM [T1] 
    INNER JOIN [T2] On [T1].[Id] = [T2].[T1Id] 
    INNER JOIN [T3] On [T2].[Id] = [T3].[T2Id] 
)a 
where a.rn = 1 
+0

這真是太好了,但我認爲在分解和排序時必須是'[T1 ]。[Id]' –

+0

我的錯誤已更新.. – praveen

1
;with a as 
(
SELECT 
[T1].[Id] ID1, [T2].[Id] ID2, [T3].[Id] ID3, 
    row_number() over (partition by [T1].[Id] order by newid()) rn 
FROM [T1] 
INNER JOIN [T2] On [T1].[Id] = [T2].[T1Id] 
INNER JOIN [T3] On [T2].[Id] = [T3].[T2Id] 
) 
SELECT ID1, ID2, ID3 
FROM a 
WHERE rn = 1