You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 12c中连接表为何需使用双引号?求技术解析

为什么在Oracle 12c中连接这两张表必须用双引号?

这问题本质是Oracle对数据库对象标识符(表名、列名、Schema名)的大小写敏感规则在搞事情,结合你的建表语句我给你掰扯清楚:

1. Oracle的默认标识符规则

平时咱们建表如果不用双引号,比如写CREATE TABLE TB1.PROPERTY,Oracle会自动把所有标识符(TB1、PROPERTY、还有列名)转换成大写存储到数据字典里。后续引用的时候,不管你写tb1.property还是TB1.PROPERTY,Oracle都会统一转成大写去匹配,完全不用纠结大小写。

2. 你的建表语句触发了大小写敏感模式

但你看自己的建表语句:

CREATE TABLE "TB1"."PROPERTY" ( 
    "ItemID" CHAR(36 BYTE) NOT NULL ENABLE, 
    "Name" NVARCHAR2(255) NOT NULL ENABLE, 
    "Type" NVARCHAR2(50), 
    "Value" NCLOB, 
    "Size" NUMBER(*,0), 
    CONSTRAINT "COMPOUNDPK" PRIMARY KEY ("ItemID", "Name")
);

CREATE TABLE "TB2"."CATALOGITEM" ( 
    "ID" CHAR(36 BYTE) NOT NULL ENABLE, 
    "Type" NUMBER(*,0), 
    "Shortcut" CHAR(1 BYTE), 
    "Name" NVARCHAR2(...)
);

所有的Schema名、表名、列名甚至主键约束名,你都用双引号""包裹了。这时候Oracle就会严格保留你写的大小写格式存储这些标识符——比如"ItemID"就是驼峰式的,不会转成大写ITEMID;"Name"就是首字母大写的,不是NAME。

3. 为什么连接时必须用双引号?

当你尝试连接这两张表时,如果不用双引号,比如写:

SELECT * FROM TB1.PROPERTY p JOIN TB2.CATALOGITEM c ON p.ItemID = c.ID;

Oracle会自动把ItemID转成ITEMID、ID转成ID?不对,是把所有未加双引号的标识符转成大写,所以p.ItemID会被解析成P.ITEMID,但你的实际列名是"ItemID"(驼峰),数据字典里根本找不到ITEMID这个列,自然会报“无效标识符”的错误。

只有用双引号包裹这些标识符,Oracle才会按照你定义的大小写去精准匹配:

SELECT * FROM "TB1"."PROPERTY" p JOIN "TB2"."CATALOGITEM" c ON p."ItemID" = c."ID";

小建议

如果不想每次引用都写双引号,后续建表时可以去掉所有双引号,Oracle会自动统一转成大写存储,引用时随便写大小写都能正常匹配,省心很多。

内容的提问来源于stack exchange,提问作者Adam M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:20:17