问题背景:
某位朋友反馈,达梦数据库查询数据指定别名查询失败,提示无效的别名。
当看见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)
Oracle 数据库:
不支持直接使用 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
MySQL数据库:
支持直接使用 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》
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




