[K/3Cloud]ksql翻译札记
2011-11-16
又学一招,集合转化临时表的方法:
var sql = string.Format(@"select b.FENTRYID,a.{2} from {0} a
inner join {1} b on a.FID = b.FID
inner join table(strSplit(@FENTRYID, ',')) on b.FENTRYID = FENTRYID",
ksql遇到Table(strSplit("xxxx",','))会把它转换成临时表,灰常好用的一个东东,赞一个,老崔,老魏辛苦了,ksql因你们而精彩。
2011-10-26
oracle里关联表更新时,外表(被更新的表)的字段是不能与子查询From后的表进行字段关联的,也就是外表的字段不能出现在On的后面,与子查询条件关联时,只能放在where条件里。
Example:
update table1 t1 set (f1,f2)=(
select u.f1,u.f2
from table2 u1
inner join table3 t3 on u1.fid=t3.fid and t1.fentryid=t3.fsrcentryid
where t1.fbomid=u1.fbomid
上面的红色部分写法错误,应该移动到where后,否则oracle报语法错误
2011-10-12
1、ksql不支持多表关联后进行删除
当oracle数据库建立的区域信息如图:
![](http://192.168.66.24/data/attachment/album/201110/12/17423549blawkzfzbkftlf.png)
以下sql执行会报错:
sbSql.AppendLine(" SELECT T1.FISWORKTIME FROM T_ENG_WORKCALDATA T1 ");
sbSql.AppendLine(" INNER JOIN T_ENG_WORKCALMAP T2 ON T1.FID=T2.FCALID ");
sbSql.AppendLine(" AND T1.FDAY>=@PreDate AND T1.FDAY<@NxtDate ");
sbSql.AppendLine(Filter);
parames.Add(new SqlParam("@PreDate", DbType.Date,date.ToShortDateString()));
parames.Add(new SqlParam("@NxtDate", DbType.Date, NextDate.ToShortDateString()));
return AppServiceContext.DBService.ExecuteDynamicObject(ctx, sbSql.ToString(), null, null, CommandType.Text, parames.ToArray());
所以对于日期作为条件参数进行查询时,不要转换成字符串,就把日期类型赋值进去就可以:
因此,只需要去掉上面代码里的ToShortDateString()即可。
其实原因就是:应用层服务器的时间格式与DB服务器的时间格式不一致导致的
这里oracle显示日期格式:DD-MM-YY
而我们服务器通常是:YYYY/MM/DD,这样4位数的年份成了oracle的天了,当然非法了。
所以遇到日期作为过滤参数,我们不用自作聪明给个字符串,给个日期类型就可以了,剩下的就是数据驱动层的事了
2011-09-27
oracle下参数化查询时,变量列表顺序必须与使用到变量顺序保持一致
如:select * from t1 where t1.f1=:f1 and t1.f2=:f2;
则定义变更序列时,必须定义f1,再定义f2,否则有可能返回不是期望的结果。
2011-09-26:
/*dialect*/
SELECT result.fid FROM
(
select fid,fmaterialid,ROW_NUMBER() over (partition by fid order by fid) as FIDGROUP from
(
select fid,fmaterialid,ROW_NUMBER() over (partition by fid,fmaterialid order by fid,fmaterialid) as MasterGroup
from t_eng_bomchild
where fmaterialid in (10069) and nvl(freplaceid,0)=0 and FMATERIALTYPE <> 2
) a where a.MasterGroup=1
) result where result.FIDGROUP=1;
如下sql在pl/sql里执行无问题,但是在代码里进行提交执行时报:ORA-00911,字符无效的错误
经过尝试,发现单条oracle语句执行,不需要加”;",去掉最后的“;”即可。
2011-09-25:
1、row_number() over (partition by field0
order by field1) 这样的分页函数,sql server(2005及以上版本)及oracle(9i及以上版本)都支持,但是ksql不支持,所以用到这个的地方,就需要进行方言执行,好在他们俩语法一样,写法不用区分
2、oracle里,不能在子查询外使用as aliasName这样的格式来定义子查询返回的子表别名,不能加as, sql server都支持,所以只要在方言执行里不加"as 表别名"这样的格式来定义别名就可以。
2011-09-01:
1、ksql只认识形如:{ts'yyyy-MM-dd HH:mm:ss'} 这样的日期字符串