我有两个表,其中action表可能包含每个设备的多个记录。 我需要测试创建一个查询,该查询仅测试操作表中是否存在3个值,并使用现有Oracle数据库将这些值与主表记录一起返回到单独的列中。
这是表结构:
Table_Device
OBJID ......递减
1 .......... DEVICE1
2 .......... device2
Table_Action
OBJID ......动作... Action2Device 的
1 ............甲.......... 1个
2 ............乙.......... 1个
3 ............甲.......... 2
4 ............Ç.......... 2
5 ............ D .......... 2
(Action2Device等于指向Table_Device.Objid的链接)
可能存在许多可能的操作,但我只对A,B和C感兴趣。我希望能够生成类似于以下内容的报告:
递减..... ActionA .... ActionB ... ActionC
device1 .. .A ................ B
装置2 ...一个..............................ç
我设法创建了一个左连接但是会为每个操作记录重复设备。有关如何编写SQL查询以产生此结果的任何建议,如上所示?
答案 0 :(得分: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
答案 1 :(得分: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))