2

我有两个表,其中操作表可能包含每个设备的多个记录。我需要测试创建一个查询,该查询测试操作表中仅存在 3 个值,并使用现有的 Oracle 数据库将这些值与主表记录一起返回到单独的列中。

这是表结构:

Table_Device
Objid......desc
1.............
device1 2............device2

Table_Action
ObjiD...Action...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 设备1..A
................B
设备2...A....... .......................C

我已经设法创建了一个左连接,但这会重复每个操作记录的设备。任何建议如何编写 SQL 查询以产生如上所示的结果?

4

2 回答 2

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
于 2013-05-07T22:20:13.533 回答
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

于 2013-05-08T03:13:55.543 回答