2013-05-07 35 views
2

我有兩個表,其中操作表可能包含每個設備的多個記錄。 我需要測試創建一個查詢,測試動作表中只有3個值的存在,並使用現有Oracle數據庫將這些值與主表記錄一起返回到主表記錄中。查詢返回可能包含或不包含在一對多關聯表中的某些值

這裏的表結構:

Table_Device
OBJID ......降序
1 .......... DEVICE1
2 ..... .....裝置2

Table_Action
OBJID ......動作... Action2Device
1 ............ A .......... 1
2 ............ B ....... ... 1
3 ............ A .......... 2
4 ............ C ... ....... 2
5 ............ d .......... 2

(Action2Device等於連結Table_Device.Objid)

有許多可能存在的操作,但我只對A,B和C感興趣。我希望能夠生成類似於以下內容的報告:

desc ..... ActionA .... ActionB ... ActionC
device1 .. .A ................ B
Device2 ... A。 ............................. C

我已經設法創建一個左連接,但重複每個設備行動記錄。如何編寫SQL查詢以產生如上所示的結果?

回答

1

有在看這個SQL Fiddle

無需左加入,我只是用一個CASE語句來創建附加列。

SELECT D.Name 
     ,MAX(CASE WHEN A.Action = 'A' THEN 'A' ELSE NULL END) AS ActionA 
     ,MAX(CASE WHEN A.Action = 'B' THEN 'B' ELSE NULL END) AS ActionB 
     ,MAX(CASE WHEN A.Action = 'C' THEN 'C' ELSE NULL END) AS ActionC 
FROM TABLE_DEVICE D 
INNER JOIN 
     Table_Action A 
ON  A.Action2Device = D.Objid 
GROUP BY 
     D.Name 
0

在Oracle 11g中,您也可以執行此操作。

with t as 
(select a.device,b.action 
from table_device a join table_action b 
on a.objid=b.action2device) 
select * 
from t 
pivot (MAX(ACTION) 
     for action 
     in ('A' AS ACTIONA,'B' AS ACTIONB,'C' AS ACTIONC)) 

http://www.sqlfiddle.com/#!4/39f97/11