【问题标题】:Select single row from two table related using mapping table SQL Server使用映射表 SQL Server 从两个相关的表中选择单行
【发布时间】:2014-05-11 10:04:17
【问题描述】:

我有三个表:Table1、Table2、Table1Table2Mapping。

每个table1数据在table1中有多个数据,这个table1关系table2是通过映射表完成的,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 中获取所有相关行及其在 table1 中的关系

我需要为每个Table1 行选择单行。

这样

Table1_ID  Name    Title
---------  ------- -----
1          Name1   Title1
2          Name2   Title3
3          Name3   Title4

【问题讨论】:

  • 到目前为止,您提出了什么查询,您在哪里卡住了?
  • 例如,您如何在 Table2_ID 101 和 102 之间进行选择?为什么结果表中有 Title1 而没有 Title2?
  • 从 [dbo] 中选择 Table1.Table1_ID、Table1.Name、Table2.Title。 [项目] Inner Join Table1Table2Mapping Table1Table2Mapping.Table1_ID=Table1.Table1_ID Inner Join Table2 on Table1Table2Mapping.Table2_ID=Table2.Table2_ID 我正在使用这个
  • 不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难....而是:更新您的问题,编辑它以提供附加信息!谢谢。

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


【解决方案1】:

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

(对于提供的数据集,这给出了相同的结果,但在现实生活中,这个和以前的解决方案的结果大不相同!

【讨论】:

  • 谢谢它对我有用,谢谢很多,我认为其他人也可以从你的回答中学习交叉应用。有用。
【解决方案2】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多