【发布时间】:2015-06-24 12:40:35
【问题描述】:
我们有一个基于 Oracle 的系统来管理设备并将其详细信息和配置存储在一个名为“configs”的表中。每个设备由几个模块组成,每个模块的配置保存为逗号分隔的字符串。例如:
device_id module values
1 1 3,4,2,3
1 2 4,1,3,4
1 3 2,1,2,3
1 4 6,4,2,1
1 5 1,4,2,3
1 6 1,3,4,4
2 1 3,4,2,3
2 2 4,1,3,4
2 3 2,3,2,3
2 4 6,4,2,1
2 5 1,8,2,3
2 6 1,3,4,4
3 1 3,4,2,3
3 2 4,1,3,4
3 3 2,1,2,3
3 4 6,4,2,1
3 5 1,4,2,3
3 6 1,3,4,4
4 1 3,4,2,3
4 2 4,1,3,4
4 3 2,1,2,4
4 4 6,4,2,1
4 5 1,4,2,3
4 6 1,3,7,4
我需要审核系统并识别其配置与已知良好配置不匹配的每个模块。理想情况下,我想运行这样的查询,假设设备 1 的配置是我的好配置:
select device_id,module
from configs
where values != (select values from configs where device_id = 1)
但这会返回错误:
ORA-01427: single-row subquery returns more than one row
如果我将查询更改为此,它可以工作:
select device_id,module
from configs
where values = (select values from configs where device_id = 1 and module = 1);
但是我必须对“模块”的每个值运行查询。
我想做的是编写一个查询,让我可以一次性完成。有人暗示我可以使用游标语句,但我一直在努力寻找“用于傻瓜的 oracle 游标”类型的文章,到目前为止,我所看到的任何内容都没有帮助我,包括 http://docs.oracle.com/cd/B28359_01/server.111/b28286/expressions006.htm#SQLRF52057。任何人都可以提出一些建议吗?
谢谢。
【问题讨论】:
-
您如何确定“已知良好的配置”是什么?
-
基本上,所有的配置都应该是一样的,但随着时间的推移,事情已经被修改了。我们知道设备 1 的配置是所有其他设备的配置。