为什么在连接两个表时我必须使用双引号?

21 浏览
0 Comments

为什么在连接两个表时我必须使用双引号?

我有两个表格,我不明白为什么需要使用双引号""来连接它们。这是在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

0
0 Comments

为什么我必须使用双引号来连接两个表?

有时候,一些不熟悉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授予权限,但这很可能不是一个好主意)。授权与双引号无关。

0