2014-01-30 36 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