某位朋友反馈,达梦数据库查询数据指定别名查询失败,提示无效的别名。
当看见SQL语句使用的别名时,很不理解,为什么用
rowid作为别名?
SQL> select id as rowid from cjc.t0601; select id as rowid from cjc.t0601; 第1 行附近出现错误[-2113]:无效的别名[ROWID]. 已用时间: 0.385(毫秒). 执行号:0.
rowid 是达梦、Oracle的关键字,不建议用于别名。
达梦数据库:
SQL> SELECT * FROM V$RESERVED_WORDS WHERE UPPER(KEYWORD) LIKE 'ROW%'; 行号 KEYWORD LENGTH RESERVED RES_SQL RES_PL RES_SCHEMA RES_VARIABLE RES_ALIAS RES_FIXED ---------- --------------- ----------- -------- ------- ------ ---------- ------------ --------- --------- 1 ROW 3 Y Y Y N N N Y 2 ROWCOUNT 8 N N N N N N N 3 ROWDEPENDENCIES 15 N N N N N N N 4 ROWNUM 6 Y Y Y N N N Y 5 ROWS 4 Y Y Y N N N Y 6 ROWID 5 N N N N N N N 6 rows got 已用时间: 1.754(毫秒). 执行号:97701.
Oracle数据库:
SQL> desc V$RESERVED_WORDS; Name Null? Type ----------------------------------------- -------- ---------------------------- KEYWORD VARCHAR2(30) LENGTH NUMBER RESERVED VARCHAR2(1) RES_TYPE VARCHAR2(1) RES_ATTR VARCHAR2(1) RES_SEMI VARCHAR2(1) DUPLICATE VARCHAR2(1) SQL> SELECT * FROM V$RESERVED_WORDS WHERE UPPER(KEYWORD) LIKE 'ROW%'; KEYWORD LENGTH R R R R D ------------------------------ ---------- - - - - - ROWIDTOCHAR 11 N N N N N ROWID 5 N N N Y N ROWS 4 N N N Y N ROW_LENGTH 10 N N N N N ROWDEPENDENCIES 15 N N N N N ROW_NUMBER 10 N N N N N ROWNUM 6 N N N Y N ROWIDTONCHAR 12 N N N N N ROW 3 N N N Y N 9 rows selected.
首先肯定是不建议用 rowid 作为列别名的,那么如果非要这么做,有什么解决办法吗?
下面分别测试了 达梦、金仓、Oracle、MySQL 使用rowid作为列别名,看看能否正常查询:
测试结果:默认参数下,不能使用rowid作为列别名。
也可能是我没找对方法,知道的朋友请留言。
create table cjc.t0601(id int); insert into cjc.t0601 values(1); commit;
用 rowid 作为列别名,在默认参数下,就算添加了 双引号、反引号 也无法正常查询。
SQL> select id as rowid from cjc.t0601; select id as rowid from cjc.t0601; 第1 行附近出现错误[-2113]:无效的别名[ROWID]. 已用时间: 0.385(毫秒). 执行号:0.
SQL> select id as "rowid" from cjc.t0601; select id as "rowid" from cjc.t0601; 第1 行附近出现错误[-2113]:无效的别名[rowid]. 已用时间: 0.320(毫秒). 执行号:0.
SQL> select id as `rowid` from cjc.t0601; select id as `rowid` from cjc.t0601; 第1 行附近出现错误[-2113]:无效的别名[rowid]. 已用时间: 0.312(毫秒). 执行号:0.
SQL> select rowid,id from cjc.t0601; 行号 ROWID id ---------- ------------------ ----------- 1 AAAAAAAAAAAAAAAAAB 1 已用时间: 0.744(毫秒). 执行号:3066708.
金仓数据库没有ROWID,对应的是CTID,可以使用 ROWID 作为列别名。
kingbase=# create table t0601(id int); CREATE TABLE kingbase=# insert into t0601 values(1); INSERT 0 1 kingbase=# select id from t0601; id ---- 1 (1 row)
可以正常查询
kingbase=# select id as rowid from t0601; rowid ------- 1 (1 row)
也可也添加双引号
kingbase=# select id as "rowid" from t0601; rowid ------- 1 (1 row)
不支持直接使用 ROWID 作为列别名,但是 加上 双引号可以正常查询。
SQL> select id as rowid from cjc.t0601; select id as rowid from cjc.t0601 * ERROR at line 1: ORA-00923: FROM keyword not found where expected SQL> select id as "rowid" from cjc.t0601; rowid ---------- 1 SQL> select rowid,id from cjc.t0601; ROWID ID ------------------ ---------- AAAYmQAAFAAAAZHAAA 1
支持直接使用 ROWID 作为列别名
mysql> use cjc; Database changed mysql> create table cjc.t0601(id int); insert into cjc.t0601 values(1); commit;Query OK, 0 rows affected (0.06 sec) mysql> insert into cjc.t0601 values(1); Query OK, 1 row affected (0.02 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select id as rowid from cjc.t0601; +-------+ | rowid | +-------+ | 1 | +-------+ 1 row in set (0.00 sec) mysql> select id as "rowid" from cjc.t0601; +-------+ | rowid | +-------+ | 1 | +-------+ 1 row in set (0.00 sec) mysql> select id as `rowid` from cjc.t0601; +-------+ | rowid | +-------+ | 1 | +-------+ 1 row in set (0.00 sec)
欢迎关注我的公众号《 IT小Chen》
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-3182993/ ,如需转载,请注明出处,否则将追究法律责任。