返回某些值的查询,这些值可能包含或不包含在1对多的相关表中

时间:2013-05-07 22:00:42

标签: sql oracle

我有两个表,其中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查询以产生此结果的任何建议,如上所示?

2 个答案:

答案 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)) 

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