我正在使用National Instrumets Teststand默认数据库设置。我试图简化上图中的数据库布局。
我可以通过一些相当“复杂”的SQL来获得我想要的东西,而且速度非常慢。
我认为有更好的方法,然后我偶然发现SELF JOIN。基本上我想要的是从一个“序列号”中获取来自几个不同行的数据值。
我的问题是将自我加入与我的表格的“常规”连接相结合。
我目前正在使用Access数据库。
答案 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
与自身连接)。
我故意添加了额外的列CCC
和DDD
,因此更容易看到如何为更大的数据集构建此列,为每个连接增加row_number偏移量。< / p>
我已经在SQL Fiddle对此进行了测试,欢迎您使用它。如果您需要应用其他过滤器,则应将where
子句置于CTE内。
请注意,您通过此类查询有效地轮播数据(我们不会聚合任何内容,因此我们无法使用内置的PIVOT
选项)。此方法和实际支点的缺点是您必须在CTE中手动指定每个列标题及其自己的CASE
语句,并在最终的select语句中指定左连接。这在中大型数据集中可能会变得难以处理,因此最适合在结果中包含少量已知列标题的情况。