函数中多游标及类型,如何过滤重复数据?

[复制链接]
查看11 | 回复6 | 2007-7-4 17:27:50 | 显示全部楼层 |阅读模式
项目中需要对一些语句的结果根据参数进行整合,采用了函数返回数据集的形式
如下:
for IssueList in Issue_cur(Dqdm) loop
stab_Follow.extend;
stab_Follow(stab_Follow.count) := ty_table_Follow(IssueList.Qid,

IssueList.Sqid,

IssueList.Username,

IssueList.Title,

IssueList.Modtime,

IssueList.Status);
end loop;
for ToAskList in ToAsk_cur(Userid) loop
stab_Follow.extend;
stab_Follow(stab_Follow.count) := ty_table_Follow(ToAskList.Qid,

ToAskList.Sqid,

ToAskList.Username,

ToAskList.Title,

ToAskList.Modtime,

ToAskList.Status);
end loop;
复制代码
请问如何保证
执行第一段代码后,执行第二段代码时,
如果ToAskList.Qid在当前stab_Follow中已经存在时,不在插入该条记录
Issue_cur和ToAsk_cur这两个结果完全有可能有重复数据,但无法单独通过一条语句区分开
且有可能ToAskList.Qid的父级Qid已经出现在Issue_cur生成的结果集中,这时候ToAskList.Qid也不需要插入
即如何根据条件判断stab_Follow中已经存在某条记录?
不知道我的意思表示清楚没有,谢谢
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
用数据举个小例子来说明, 看看是否能用一句SQL语句实现!
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
无法举例,数据比较复杂,主要涉及类似树的关系
父ID存在于这个集,子ID不能存在于这个集
语句肯定不相同,重复的最大可能性存在于父ID存在的情况下,有可能还会取到子ID
这时候需要过滤掉
我的问题关键不在于是否可以用一条SQL语句过滤出唯一
而在于如何在Type中判断是否存在记录
所以不需要考虑一条SQL语句过滤的问题
基本上我的设计,类似于union 和union all的区别
但还考虑父子,必须只留下一棵树中的顶层结点
PS:父子也不存在于一个表,根据情况父子的关系也不一定固定
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
没人解答啊@@
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
第一选择:
修改你两个游标的SQL, 让它们提供干净的数据;
第二选择:
把结果集stab_Follow当作表来访问:
SELECT COUNT(*) FROM TABLE(CAST(stab_Follow AS ....)) WHERE ...
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
第一选择暂时排除
第二选择我也考虑过
主要是担心效率问题
因为游标不止一个
而且每次循环都执行一边你说的语句的话,似乎损耗比较厉害?
有其他更好的方法么?
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
要是我的话肯定想办法改游标。
其他办法:你另外定义一个INDEX BY数组,用QID做下标,新增一个记录时就赋值:FLAG(IssueList.QID):=1;
用FLAG.EXIST(IssueList.QID)判断是否存在。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行