[Oracle] 别被View 整伤了

前言

遇到一种奇怪的状况:

对某个View 进行查询时,加条件比不加条件找到的数据还要多。

类似:

select * from view;  找到 1条数据

select * from view where XX=XXX; 却找到了10 条数据。

这看上去是一件毁“三观”的状况。


无庸置疑,原因肯定是出在View 的定义上了。 这个View 的定义唯一特殊的地方是使用了wm_concat 这个函数。


简化重现

为了更好的分析这个问题, 简化的重现一下状况:


暂且以三国的战争列表为例。(数据是瞎诌的)

1. 定义一张表

create table WAR_LIST
(
  WAR_NAME varchar2(40),
  WAR_TIME date,
  WAR_PARTIES varchar2(40)
);

定义了战争名称,发生时间和一个随意的名称(姑且认为是参与方吧)


2. 添加数据

insert into WAR_LIST(WAR_NAME,WAR_TIME,WAR_PARTIES) values('CHIBI',sysdate,'THREE.KINGDOM1.CITY');
insert into WAR_LIST(WAR_NAME,WAR_TIME,WAR_PARTIES) values('CHIBI',sysdate,'THREE.KINGDOM2.CITY');
insert into WAR_LIST(WAR_NAME,WAR_TIME,WAR_PARTIES) values('CHIBI',sysdate,'THREE.KINGDOM9.CITY');
insert into WAR_LIST(WAR_NAME,WAR_TIME,WAR_PARTIES) values('CHIBI',sysdate,'THREE.KINGDOM5.CITY');
insert into WAR_LIST(WAR_NAME,WAR_TIME,WAR_PARTIES) values('CHIBI',sysdate,'THREE.KINGDOM6.CITY');

3.  搜索数据

select distinct T1.WAR_NAME,TO_CHAR(T2.WAR_TIME,'YYYY/MM') AS YEAR_NONTH,T1.A2,'AllParties' as type from
  (select WAR_NAME,wm_concat(WAR_PARTIES) as A2 from WAR_LIST group by WAR_NAME) T1 
  inner join WAR_LIST T2 on T1.WAR_NAME=T2.WAR_NAME where  TO_CHAR(T2.WAR_TIME,'YYYY/MM')= '2013/11';

这个SQL 只是把参与方, 汇总了一下。

期望的是找到一条数据, 但是结果却如下:


 

看上去使用 wm_concat 合并的结果顺序会不一样。

如果使用这种SQL 去创建View 的话, 肯定会出现前言所描述的状况。


结言

1.  如果concat 栏位的值比较简单的话, 出现以上状况的几率看上去比较小。

2. 定义View 的时候需要慎重使用wm_concat 了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oscar999

送以玫瑰,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值