为啥我必须使用双引号来连接 2 个表? [复制]
Posted
技术标签:
【中文标题】为啥我必须使用双引号来连接 2 个表? [复制]【英文标题】:Why do I have to use double quotes to join 2 tables? [duplicate]为什么我必须使用双引号来连接 2 个表? [复制] 【发布时间】:2018-03-30 18:18:21 【问题描述】:我有 2 个表,我不明白为什么我需要使用双引号 "" 将它们连接起来。这是在 ORACLE 12c 中运行的...
谁能给我解释一下?
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(255),
PRIMARY KEY ("ID")
SELECT *
FROM CATALOGITEM c, PROPERTY p
WHERE p."ItemID" = c."ID"
我收到以下错误:
ORA-00904: "P"."ITEMID": 无效标识符 00904. 00000 - “%s:无效标识符” *原因: *操作:行错误:8 列:8
【问题讨论】:
docs.oracle.com/cd/E11882_01/server.112/e41084/… PROPERTY 和 CATALOGITEM 表属于两个不同的模式 TB1 和 TB2。您的 SQL 中缺少这些模式限定符。 不要使用带引号的、大小写混合的标识符。它从来没有帮助...... 很好,ArtBajji,我只是模拟了那些表脚本作为一个简单的例子,它们实际上在模式中。 有人能解释一下这个问题是如何被投票的吗? 【参考方案1】:一个常见的错误人 - 其起源不是 Oracle - 这样做:使用混合大小写并将表和列名称括在双引号中。你可以这样做并不意味着你应该这样做。没有好处,有很多缺点。
每当您引用此类表或列时,您必须将其名称用双引号括起来并正确输入其名称,即不要输入错误。例如,“FirstName”将不同于“Firstname”或“FIRSTNAME”。
很快 - 去掉双引号。随便输入那些名字——你不必注意它。 Oracle 会将这些名称以大写形式存储到数据字典中,但您可以随意引用它 - 无需使用双引号(名字、名字、FIRSTNAME - 都一样)。
由于错误的原因 - 这些表属于不同的用户,因此您必须从一个用户获取授权(至少 SELECT)才能使其正常工作。
(在这里并不重要,但是 - 那些 CREATE TABLE 语句是无效的,都错过了最后的右括号)。
演示:
SQL> show user
USER is "SCOTT"
SQL> CREATE TABLE scott."PROPERTY"
2 ( "ItemID" CHAR(36 BYTE) NOT NULL ENABLE,
3 "Name" NVARCHAR2(255) NOT NULL ENABLE,
4 "Type" NVARCHAR2(50),
5 "Value" NCLOB,
6 "Size" NUMBER(*,0),
7 CONSTRAINT "COMPOUNDPK" PRIMARY KEY ("ItemID", "Name"));
Table created.
以用户 MIKE 连接并创建另一个表:
SQL> connect mike/lion@xe
Connected.
Session altered.
SQL> CREATE TABLE mike."CATALOGITEM"
2 ( "ID" CHAR(36 BYTE) NOT NULL ENABLE,
3 "Type" NUMBER(*,0),
4 "Shortcut" CHAR(1 BYTE),
5 "Name" NVARCHAR2(255),
6 PRIMARY KEY ("ID"));
Table created.
SQL> select *
2 from catalogitem c, property p
3 where p."ItemID" = c."ID";
from catalogitem c, property p
*
ERROR at line 2:
ORA-00942: table or view does not exist
正如预期的那样,这是行不通的。现在,回到 SCOTT 并授予 MIKE 一些权限:
SQL> connect scott/tiger@xe
Connected.
Session altered.
SQL> grant select on property to mike;
Grant succeeded.
回到麦克:
SQL> connect mike/lion@xe
Connected.
Session altered.
SQL> select *
2 from catalogitem c, scott.property p --> note SCOTT here!
3 where p."ItemID" = c."ID";
no rows selected
SQL>
【讨论】:
好的,我想我明白了。这些表是用双引号“”创建的,因此需要以这种方式引用它们。这是一个第 3 方应用程序,我无法控制设计本身。我对你正在做的配置有点困惑?赋予用户不同的权限将允许引用不带双引号的表? 您创建了两个表。其中一个属于用户TB1,另一个属于用户TB2。如果要运行查询,其中一个用户必须(至少)授予另一个用户 SELECT 权限。然后,该“另一个”用户必须在该表名称之前加上其所有者名称。否则,这将行不通(除了授予 PUBLIC 特权,但这很可能不是一个好主意)。格兰特与双引号无关。以上是关于为啥我必须使用双引号来连接 2 个表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章