oracle - ORACLE 12.2.01 从具有相似名称的不同表中选择列 --> 使用内部列标识符
问题描述
我编写了一个执行 UNION 的 SELECT,并在每个 UNION 部分中使用了一些 JOIN。连接的表具有部分相同的列标识符。如果执行“SELECT *”,ORACLE 决定显示内部列名而不是“真实”列名。
为了显示效果,我创建了两个表(列标识符部分相似,“TID”和“TNAME”)并用一些数据填充它们:
create table table_one (tid number(10), tname varchar2(10), t2id number(10));
create table table_two (tid number(10), tname varchar2(10));
insert into table_two values (1,'one');
insert into table_two values (2,'two');
insert into table_two values (3,'three');
insert into table_one values (1,'eins',1);
insert into table_one values (2,'zwei',2);
insert into table_one values (3,'drei',3);
之后我使用以下语句选择了列:
select *
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 1
union
select *
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 2;
并得到了这个令人困惑的结果:
QCSJ_C000000000300000 QCSJ_C000000000300002 T2ID QCSJ_C000000000300001 QCSJ_C000000000300004
1 eins 1 1 one
2 zwei 2 2 two
当使用表名编写语句以指定列时,一切都按我的预期工作:
select table_one.* , table_two.*
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 1
minus
select *
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 2;
TID TNAME T2ID TID TNAME
1 eins 1 1 one
2 zwei 2 2 two
有人能解释一下吗?
我用另外两个表扩展了我的测试,以防止在语句中重复使用表:
create table table_3 (tid number(10), tname varchar2(10), t4id number(10));
create table table_4 (tid number(10), tname varchar2(10));
insert into table_4 values (1,'one');
insert into table_4 values (2,'two');
insert into table_4 values (3,'three');
insert into table_3 values (1,'eins',1);
insert into table_3 values (2,'zwei',2);
insert into table_3 values (3,'drei',3);
select *
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 1
union
select *
from table_3
inner join table_4 on table_4.tid = table_3.t4id
where table_3.tid = 2;
select *
from table_one
inner join table_two on table_two.tid = table_one.t2id
where table_one.tid = 1
union
select *
from table_3
inner join table_4 on table_4.tid = table_3.t4id
where table_3.tid = 2;
结果是一样的。Oracle 使用内部标识符。
解决方案
根据 Oracle (DocId 2658003.1),当满足三个条件时会发生这种情况:
- ANSI 连接
- 联合/联合所有
- 同一个表在查询中出现多次
显然,当 Oracle 转换 ANSI 样式连接时,内部使用了“QCSJ_C”。
编辑:
找到一个最小的例子:
SELECT * FROM dual d1 JOIN dual d2 ON d1.dummy=d2.dummy
UNION
SELECT * FROM dual d1 JOIN dual d2 ON d1.dummy=d2.dummy;
QCSJ_C000000000300000 QCSJ_C000000000300001
X X
它可以通过使用非 ANSI 连接语法来修复:
SELECT * FROM dual d1, dual d2 WHERE d1.dummy=d2.dummy
UNION
SELECT * FROM dual d1, dual d2 WHERE d1.dummy=d2.dummy;
DUMMY DUMMY_1
X X
或者,最好使用列名而不是*
:
SELECT d1.dummy, d2.dummy FROM dual d1 JOIN dual d2 ON d1.dummy=d2.dummy
UNION
SELECT d1.dummy, d2.dummy FROM dual d1 JOIN dual d2 ON d1.dummy=d2.dummy;
DUMMY DUMMY_1
X X
推荐阅读
- vscode-remote - Remote-SSH:Winsows 机器上的身份文件路径格式
- php - PHP 5.4 API 中的请求值总是为空
- google-chrome-extension - 在“changeInfo.status = loading”和“changeInfo.status = completed”上执行脚本之间的区别
- c++ - 内联 constexpr 和匿名命名空间变量?
- node.js - Node模块的依赖在更新或安装后不会更新?
- flutter - 如何比较颤动中的类对象列表?
- angular - 简单的应用程序路由不起作用 - Angular
- python - Python 中的 C++ 类和 C++ 中的 Python 类
- python - Hazelcast 和 python 没有适合 -120 类型的反序列化器
- oracle-apex - 创建新记录并返回新 ID