Skip to main content

同标准sql的主要语法区别

1、vsql里支持直接写查询名称便能引用查询,目前遵从数据库视图的用法,只实现在select查询中的fromjoin子句引用,并且查询插件不实现。示例:

# 其中query1查询:
select a.a1 from a
# 其中query2查询:
select b.b1 from b

# 直接写查询名称(query1、query2)引用查询

select a.a1 from
query1 a
left join
query2 b
on a.id=b.id

2、函数必须用文档里规定的函数(数值函数字符函数时间函数统计函数其它函数自定义函数)。

3、参数名称需要以字母开头。示例:

select a.field1 from table1 a,table2 b where a.field1=:1212a

# 1212a 改为 a1212

select a.field1 from table1 a,table2 b where a.field1=:a1212

4、子查询在from或者join后面的必须增加别名。示例:

select field1 from (select a.field1 from table1 a) 

# 在from后面的子查询增加别名,改为

select field1 from (select a.field1 from table1 a) b

5、Union all 使用时需要使用子查询。示例:

select field1 from table1 union all select field1 from table2

# 当前查询作为子查询并加上别名,改为

select field1 from (
select field1 from table1 union all select field1 from table2
) b

如果连接其他表或者查询。示例:

select c.field1 from
(select field1 from table1 union all select field1 from table2) c
inner join table3 don c.field1=d.field1

# 改为

select e.field1 from
(select c.field1 from
(select field1 from table1 union all select field1 from table2) c
) e
inner join table3 don e.field1=d.field1

6、Union all使用时需要保证查询字段的数据类型一致,并且最好不要写select * ,因为很有可能解析 * 后字段顺序会不对。

7、分页使用limit,使用时如果没有order by则会缺省加上id字段排序,如果该查询没有id字段则必须有order by 子句。示例:

# 指按每页十条记录从第一条开始取。
select a.field1 from table1 a order by field2 limit 10,1

8、不要使用关键字或者函数名命名字段。示例:

select uuid from table1 a

# 改为

select id from table1 a

9、字符串连接用||代替,不能用+号。

# 连接多个字符串
SELECT ename + ':' + sql FROM emp;

# 改为

SELECT ename || ':' ||sql FROM emp;

10、like 表达式中如果有特殊字符示例:’ %[],请使用参数形式示例:

select  field1
from table1 a
where a.id like%/[/_’’%escape/

# 改为

select field1
from table1 a
where a.id like :parm1 escape :parm2

‘%/[/_’’%’ ‘/’’ 由参数替代。

注意:sqlserver"/", "%", "_", "[","]"需要转义。而db2oracle中只"%", "_"需要转义。

11、sql中的over统计函数使用rownum函数以及统计函数中的参数来体现,详细见《统计函数》。

12、常量查询需要使用dual表来查。示例:

select 1

# 改为

select 1 from dual

13、*号不能和其他字段一起使用,需要加表别名。示例:

select *,field1 from table1

# 改为

select a.*,a.field1 from table1 a

14、由于oracledb2不支持查询语句结果字段中的子查询中的子查询直接引用主查询字段,即只支持一级子查询引用主查询字段,所以查询语句结果字段中存在子查询并且是分页(如取第一条记录)以及存在主查询关联字段需要改写法。

示例:下面的查询price表示查找b表和a表中相同的code的按时间倒序排序的第一条记录的price。

select  a.code,a.name
,(select b.price from
work b where b.code = a.code order by b.time desc limit 1, 1
) price
from contact a

# 改为

select a.code,a.name
,(select b.price from
(select rownum("partition by b.code order by b.time desc") num,b.code from work b
) b
where num =1 and b.code = a.code
) price
from contact a

这里使用了rownum函数先对b表的相同code的按时间倒序排序建立序号,再查出第一条记录。

15、由于oracledb2不支持查询语句结果字段中的子查询中join子句的on条件直接引用主查询字段,所以请把这些条件写在where子句中。示例:

select a.a1,(select b.b1 from b inner join c on b.b2=c.c1 and b.b2=a.a2) a3 
from table1 a

# and 改成 where

select a.a1,(select b.b1 from b inner join c on b.b2=c.c1 where b.b2=a.a2) a3
from table1 a