2016-02-12 158 views
-2

表,并要求输出 enter image description hereSQL,自加入3连接表

我使用的是国家Instrumets TestStand中默认数据库设置。我试图简化上图中的数据库布局。

我可以设法通过一些相当“复杂”的sql来获得我想要的,并且它非常缓慢。

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

我的问题是结合自我加入与我的表的“一般”加入。

此刻我正在使用Access Databdase。

+1

请包括您的表格结构和输出(连同样本数据)作为问题的一部分,而不是链接到图像。如果问题/答案包含与相关信息的死链接,将来对其他人来说将毫无用处。 http://stackoverflow.com/help/how-to-ask –

+0

另外,请包括您迄今为止尝试过的内容。 –

+0

你能告诉我们你有什么? – GabrielVa

回答

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 

这将使用自我任命为你提到的(在那里你看到x被甩加入到自己多次在最后的选择声明)。

我有意添加了额外的列CCCDDD,所以很容易看出你如何为更大的数据集构建这个列,增加每个连接的row_number偏移量。

我已经在SQL Fiddle中测试过了,欢迎您随时随地使用它。如果您需要应用其他过滤器,则应将您的where子句放置在CTE内。

请注意,您使用这种查询有效地转移数据(除非我们不汇总任何内容,因此我们无法使用内置的PIVOT选项)。这种方法和真正的主要缺点是你必须手动指定列标题与CTE自己的CASE语句,并在最后的选择语句左加入。在大中型数据集中这可能会很难处理,所以最适合在结果中只有少​​量已知列标题的情况下使用。