为什么在连接两个表时我必须使用双引号?
为什么在连接两个表时我必须使用双引号?
我有两个表格,我不明白为什么需要使用双引号""来连接它们。这是在ORACLE 12c中运行的...
有人能解释给我吗?
创建表格"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")
创建表格"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": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action: 错误行:8列:8
为什么我必须使用双引号来连接两个表?
有时候,一些不熟悉Oracle的人会犯一个常见的错误:使用大小写混合,并将表和列名用双引号括起来。虽然你可以这样做,但并不意味着你应该这样做。这样做没有任何好处,只会带来很多问题。
每次引用这样的表或列时,你必须将其名称用双引号括起来,并正确地输入其名称,不能打错。例如,"FirstName"与"Firstname"或"FIRSTNAME"是不同的。
简而言之,摆脱双引号。你可以按照任何你想要的方式输入这些名称 - 你不必关注它。Oracle会将这些名称存储为大写字母,并且你可以按照任何你想要的方式引用它们 - 不使用双引号(firstname,FirstName,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 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 Connected. Session altered. SQL> grant select on property to mike; Grant succeeded.
再次切换到MIKE:
SQL> connect mike/lion Connected. Session altered. SQL> select * 2 from catalogitem c, scott.property p ---> 注意这里的SCOTT! 3 where p."ItemID" = c."ID"; no rows selected SQL>
好的,我想我明白了。这些表是用双引号""创建的,因此需要以这种方式引用它们。这是一个第三方应用程序,我对设计本身没有控制权。我对你正在进行的权限设置有点困惑?给用户不同的权限将允许引用表而无需使用双引号?
你创建了两个表。其中一个属于用户TB1,另一个属于用户TB2。如果你想要运行查询,其中一个用户必须授予另一个用户(至少)SELECT权限。然后,那个“另一个”用户必须在表名前加上其所有者的名称。否则,这将不起作用(除非向PUBLIC授予权限,但这很可能不是一个好主意)。授权与双引号无关。