2016-02-12 4 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語句,並在最後的選擇語句左加入。在大中型數據集中這可能會很難處理,所以最適合在結果中只有少​​量已知列標題的情況下使用。