繁体   English   中英

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

[英]Join two tables returning all rows as single row from the second table

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

  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

以下使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM