下面提到的别名的技巧,虽然不是高深的问题,但是自己在开发中犯了几次这样的错误,在这里整理分享。
先在DB2和Oracle中分别创建如下的测试表。
create table table1
( col1 integer,
col2 integer);
DB2:
insert into table1
select * from (
select 1 col1,
2 col2 from sysibm.sysdummy1) with ur ;
报如下错误:SQL0104N 在 ")" 后面找到异常标记 ""。预期标记可能包括:"AS"。 SQLSTATE=42601
在DB2 中一个嵌套查询中的子查询,应该指定别名。在Oracle 中这样的写法是没有问题的。
DB2中正确的写法如下:
insert into table1
select * from (
select 1 col1,
2 col2 from sysibm.sysdummy1) as t with ur ;
Oracle 中这句执行是正常的
insert into table1
select * from (
select 1 col1,
2 col2 from dual);
除了上面这点,在DB2 中使用列别名需要注意下面的情况。下面这句SQL语句引用的列t.col1,t.col2 是无效的。
select t.col1,t.col2 from (
select 1 as col1,
2 as col2 from sysibm.sysdummy1
union all
select 1,
2 from sysibm.sysdummy1) as t with ur;
该语句将会报如下的错:SQL0206N "T.COL1" 在使用它的上下文中无效。 SQLSTATE=42703
之所以报错是因为是因为引用的列名无效。DB2中如果不给select 语句中的列显式指定别名
将会使用选择的列在select 语句中的位次给定一个数值列别名,比如方式三中的1和2。
在DB2中将语句改写成下面的方式执行正确。
方式一:
select * from (
select 1 as col1,
2 as col2 from sysibm.sysdummy1
union all
select 1,
2 from sysibm.sysdummy1) as t with ur;
方式二:
select col1,col2 from (
select 1 as col1,
2 as col2 from sysibm.sysdummy1
union all
select 1 col1,
2 col2 from sysibm.sysdummy1) as t with ur;--as 关键字是可选的。
方式三:
select 1,2 from (
select 1 as col1,
2 as col2 from sysibm.sysdummy1
union all
select 1,
2 from sysibm.sysdummy1) t with ur;--在这句中实际列的别名是1和2,而不是col1和col2。
在Oracle 中执行类似的语句是正确的:
select col1,col2 from (
select 1 as col1,
2 as col2 from dual
union all
select 1,
2 from dual )
另外需要注意的是DB2和Oracle 中group by 子句中不能引用列别名,但是order by 子句中可以引用。
添加新评论2 条评论
2013-07-22 09:24
2013-07-21 22:36