SQL,自联接3个连接表

时间:2016-02-12 14:03:56

标签: sql join

表格和请求的输出 enter image description here

我正在使用National Instrumets Teststand默认数据库设置。我试图简化上图中的数据库布局。

我可以通过一些相当“复杂”的SQL来获得我想要的东西,而且速度非常慢。

我认为有更好的方法,然后我偶然发现SELF JOIN。基本上我想要的是从一个“序列号”中获取来自几个不同行的数据值。

我的问题是将自我加入与我的表格的“常规”连接相结合。

我目前正在使用Access数据库。

1 个答案:

答案 0 :(得分:0)

这将为您提供样本数据的目标输出:

with x as (
 select
 row_number() over (partition by t1.Serial order by t1.Serial) as [RN],
 t1.Serial,
 case when t3.Sub_Test_Name = 'AAA' then t3.Value end as [AAA],
 case when t3.Sub_Test_Name = 'BBB' then t3.Value end as [BBB],
 case when t3.Sub_Test_Name = 'CCC' then t3.Value end as [CCC],
 case when t3.Sub_Test_Name = 'DDD' then t3.Value end as [DDD]

 from Table_1 t1
 inner join Table_2 t2 on t2.Table_1_Id = t1.Id
 inner join Table_3 t3 on t3.Table_2_Id = t2.Id
)

select
x.Serial,
AAA.AAA,
BBB.BBB,
CCC.CCC,
DDD.DDD

from x
left outer join x AAA on AAA.Serial = x.Serial and AAA.RN = x.rn + 0
left outer join x BBB on BBB.Serial = x.Serial and BBB.RN = x.rn + 1
left outer join x CCC on CCC.Serial = x.Serial and CCC.RN = x.rn + 2
left outer join x DDD on DDD.Serial = x.Serial and DDD.RN = x.rn + 3

where x.rn = 1

如您所提到的那样使用自联接(您可以在最终的select语句中多次看到x与自身连接)。

我故意添加了额外的列CCCDDD,因此更容易看到如何为更大的数据集构建此列,为每个连接增加row_number偏移量。< / p>

我已经在SQL Fiddle对此进行了测试,欢迎您使用它。如果您需要应用其他过滤器,则应将where子句置于CTE内。

请注意,您通过此类查询有效地轮播数据(我们不会聚合任何内容,因此我们无法使用内置的PIVOT选项)。此方法和实际支点的缺点是您必须在CTE中手动指定每个列标题及其自己的CASE语句,并在最终的select语句中指定左连接。这在中大型数据集中可能会变得难以处理,因此最适合在结果中包含少量已知列标题的情况。

相关问题