连接两个表,将所有行作为第二个表的单行返回

时间:2018-10-12 21:41:16

标签: sql sql-server

我想从具有一对多关系的两个表中的一行中获取数据。

  1. 主表
  2. 辅助表

我知道对于主表的每个记录,辅助表最多可以有10行。这是表格的结构

主表

 -------------------------------------------------
| ImportRecordId   |       Summary                |
--------------------------------------------------
|        1         |       Imported Successfully  |
|        2         |       Failed                 |
|        3         |       Imported Successfully  |
 -------------------------------------------------

辅助表格

 ------------------------------------------------------
| ImportRecordId   |       CodeName   |  CodeValue     |
-------------------------------------------------------
|        1         |       ABC        |  123456A       | 
|        1         |       DEF        |  8766339       |
|        1         |       GHI        |  887790H       |
 ------------------------------------------------------

我想编写一个具有内部联接的查询,以从辅助表中获取数据的方式,即从辅助表中将每一行都视为列,而不是显示为多行。 我可以硬编码20个列的名称(因为辅助表中最多可以存在10条记录,并且我想在一行中显示两列的值),因此,如果辅助表中的记录少于10条,则所有其他列将显示为空值。

这里是预期的输出。您可以看到,对于主表中的第一条记录,只有三行,这就是为什么将这三行中的两个必需列转换为列,而对于所有其他列的值都是空。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| ImportRecordId |        Summary        | CodeName1 |  CodeValue1 |  CodeName2 | CodeValue2 |  CodeName3 |  CodeValue3 |  CodeName4 |  CodeValue4|  CodeName5 |  CodeValue5|  CodeName6 |  CodeValue6|  CodeName7 |  CodeValue7 |  CodeName8 |  CodeValue8 | CodeName9 |  CodeValue9 | CodeName10 |  CodeValue10|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|        1       | Imported Successfully |    ABC    |    123456A  |    DEF    |    8766339  |     GHI    |  887790H    |    NULL    |    NULL    |    NULL     |    NULL    |    NULL    |    NULL   |    NULL    |    NULL     |    NULL     |    NULL    |    NULL   |    NULL     |    NULL    |    NULL     |
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这是我简单的SQL查询,它从两个表中返回所有数据,但是我想从辅助表中获取多行,就像上面的结果集一样,它们要放在一行中。

Select p.ImportRecordId,p.Summary,s.*
from [dbo].[primary_table] p
inner join [dbo].[secondary_table] s on p.ImportRecordId = s.ImportRecordId

1 个答案:

答案 0 :(得分:0)

以下使用Row_Number(),JOIN和CROSS APPLY创建PIVOT的源代码

您必须添加CodeName / Value 4 ... 10

示例

Select *
 From  (
        Select A.[ImportRecordId]
              ,B.Summary
              ,C.*
         From (
                Select *
                      ,RN = Row_Number() over (Partition by [ImportRecordId] Order by [CodeName])
                 From   Secondary A
              ) A
         Join   Primary B on A.[ImportRecordId]=B.[ImportRecordId]
         Cross Apply (values (concat('CodeName' ,RN),CodeName)
                            ,(concat('CodeValue',RN),CodeValue)
                     ) C(Item,Value)
       ) src
 Pivot (max(value) for Item in (CodeName1,CodeValue1,CodeName2,CodeValue2,CodeName3,CodeValue3) ) pvt

返回

ImportRecordId  Summary                 CodeName1   CodeValue1  CodeName2   CodeValue2  CodeName3   CodeValue3
1               Imported Successfully   ABC         123456A     DEF         8766339     GHI         887790H