为啥我必须使用双引号来连接 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 个表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不计算第二个表中的双打的情况下建立连接? [复制]

Python文本解析 - 你知道为啥双引号出现在我中间没有任何东西的地方吗? [复制]

json属性名为啥要双引号

为啥双引号变单引号了?

为啥从返回的网格中复制的值用引号标记?

为啥双引号会变成单引号