rlt 发表于 2009-07-19 15:11

IQ视图查询出错!急

我在IQ新建一个视图,其中select字句含有嵌套子查询,语句如下:
create view tmp as
select a.f1, (select b.f1 from b where b.f2=a.f2) as fx
from a;

生成VIEW时正常,查询VIEW时则提示:Subqueries are allowed only as arguments of comparisons,IN,and EXISTS。
但直接运行其中的select 语句可以查询出数据,没有任何出错,语句如下
select a.f1, (select b.f1 from b where b.f2=a.f2) as fx
from a;
后来发现将表b改为sys用户下的表名则可以查询。

请问IQ的视图是否不允许嵌套子查询?或用户建的表不能用在子查询中?
因a表中的字段大多数是编码,需要关联多个维表来显示中文名称,如果采用外连接是否会导致性能下降?
还有什么办法可以处理这种情况?

恳请各位指导!

[ 本帖最后由 rlt 于 2009-7-19 15:48 编辑 ]

chuxu 发表于 2009-07-20 07:58

后来发现将表b改为sys用户下的表名则可以查询。
是什么意思?改了view的定义就好了?

rlt 发表于 2009-07-20 09:20

子查询改为查系统表(以“sys.”开头的表)的话,视图就可以正常查询。
如果改为用户定义的表,查询时就会提示“Subqueries are allowed only as arguments of comparisons,IN,and EXISTS”。
可以在IQ建个视图试试。

我现在想搞清楚IQ是否不允许视图采用嵌套子查询,或者是视图定义的语法有误?
如果不行的话就只能通过外连接取字典值了。

enjoy-work 发表于 2009-07-20 09:36

你的问题有多个:
1. IQ 为什么创建view时不报错,而运行时候报错?

   IQ在创建view是并不进行语法和语意检查;但是运行时候需要。

2. 为什么改为系统表就可以,而base表出错?

   系统表存放在ASA中,它的语法和行为和IQ base表的语法和行为不同。

3. 如何避免?

建议使用join。Join并不会导致性能下降,想法substring可能会导致,因为IQ会尽量将这种查询转换为join。
页: [1]
查看完整版本: IQ视图查询出错!急