使用映射表SQL Server从两个表中选择单行

时间:2014-05-11 10:04:18

标签: sql sql-server sql-server-2008

我有三个表: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

2 个答案:

答案 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

Using CROSS APPLY in TechNet

修改 如果它足够了,你也可以使用聚合:

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