我有三个表:Table1,Table2,Table1Table2Mapping。
每个tabel1数据在tabel1中有多个数据,这个table1关系表2是通过映射表完成的,table1和table2的主键放在映射表中。
Table1
:
Table1_ID Name ,Other columns
--------- ---- ------
1 Name1
2 Name2
3 Name3
Table2
:
Table2_ID Title
--------- -----
101 Title1
102 Title2
103 Title3
104 Title4
105 Title5
Table1Table2Mapping
:
Table1_ID Table2_ID
--------- ------------
1 101
1 102
2 103
3 104
3 105
我从table1获取了所有相关的行,并通过mappping table
获取了table1中的关系我需要为每个Table1
行选择一行。
喜欢这个
Table1_ID Name Title
--------- ------- -----
1 Name1 Title1
2 Name2 Title3
3 Name3 Title4
答案 0 :(得分:2)
CROSS APPLY
可以解决问题:
SELECT
T1.Table1_ID
, T1.Name
, TMP.Title
FROM
Table1 T1
CROSS APPLY (
SELECT TOP(1)
T2.Title
FROM
Table2 T2
INNER JOIN Table1Table2Mapping TTM
ON T2.Table2_ID = TTM.Table2_ID
WHERE
TTM.Table1_ID = T1.Table1_ID
ORDER BY
TTM.TAble2_ID ASC -- You can change this order to what you want
) TMP
您可以更改子查询的顺序。
<强> SQL Fiddle 强>
修改强> 如果它足够了,你也可以使用聚合:
SELECT
T1.Table1_ID
, T1.Name
, MIN(T2.Title) -- You can use MAX
FROM
Table1 T1
INNER JOIN Table1Table2Mapping TTM
ON TTM.Table1_ID = T1.Table1_ID
INNER JOIN Table2 T2
ON T2.Table2_ID = TTM.Table2_ID
GROUP BY
T1.Table1_ID
, T1.Name
(这为所提供的数据集提供了相同的结果,但在现实生活中,此结果与之前的解决方案大不相同!
答案 1 :(得分:0)
在sql server 2005及更高版本中使用外部应用
Select Table1.*, ttt.Title From Table1 Outer Apply
(Select Top 1 Table2.* From Table2 Inner Join Table1Table2Mapping
On Table2.Table2_Id = Table1Table2Mapping.Table2_Id
Where Table1.Table1_Id = Table1Table2Mapping.Table1_Id) ttt