Sql 返回某些值的查询,这些值可能包含在一对多的相关表中,也可能不包含在该表中
我有两个表,其中action表可能包含每个设备的多个记录。 我需要测试创建一个查询,该查询测试action表中是否只存在3个值,并使用现有Oracle数据库在单独的列中返回这些值以及主表记录 以下是表格结构: 桌上设备Sql 返回某些值的查询,这些值可能包含在一对多的相关表中,也可能不包含在该表中,sql,oracle,Sql,Oracle,我有两个表,其中action表可能包含每个设备的多个记录。 我需要测试创建一个查询,该查询测试action表中是否只存在3个值,并使用现有Oracle数据库在单独的列中返回这些值以及主表记录 以下是表格结构: 桌上设备 目标……描述 1………设备1 2………设备2 表格动作 对象…操作…操作2设备 1…………A…………1 2………B………1 3……….A……….2 4………C………2 5……….D……….2 (Action2Device等于表_Device.Objid的链接) 有许多可能的操作可
目标……描述
1………设备1
2………设备2 表格动作
对象…操作…操作2设备
1…………A…………1
2………B………1
3……….A……….2
4………C………2
5……….D……….2 (Action2Device等于表_Device.Objid的链接) 有许多可能的操作可以呈现,但我只对A、B和C感兴趣。我希望能够生成类似以下内容的报告: 描述……行动a……行动b……行动c
设备1。A……….B
设备2…A…C 我已经设法创建了一个左连接,但它会为每个操作记录重复设备。有没有建议如何编写SQL查询以生成如上所示的结果 看看这个 不需要左连接,我只是使用
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
在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))