ORA-00918: FOR pharmacyschema.sql (RX 药房数据库) 的列定义不明确

Posted

技术标签:

【中文标题】ORA-00918: FOR pharmacyschema.sql (RX 药房数据库) 的列定义不明确【英文标题】:ORA-00918: column ambiguously defined FOR pharmacyschema.sql (RX pharmacies Database) 【发布时间】:2020-11-26 20:16:15 【问题描述】:
SQL> Select PCompany.CName, CPhone from PCOMPANY
  2  INNER JOIN SELLS on PCOMPANY.CNAME = SELLS.CNAME
  3  INNER JOIN Pharmacy on Sells.PhName = Pharmacy.PhName
  4  WHERE
  5  PHNAME = 'Shoppers';

PHNAME = '购物者' * 第 5 行的错误: ORA-00918: 列定义不明确

问题要求:在图 1.1 的 Pharmacy 记录数据库架构上用 SQL 指定以下 5 个查询。

我。首先在 SQL 中列出下表中的所有 5 个查询。

【问题讨论】:

错误文本非常准确地找出原因。 oracle 将如何知道您要使用哪个PHNAME?您可以查看连接条件,看看它至少有两个来源。 从 PCompany 中选择 PCompany.CName、CPhone INNER JOIN Sells ON PCompany.CName = Sells.CName INNER JOIN Pharmacy ON Sells.PHNAME = Pharmacy.PHNAME WHERE Pharmacy.PHNAME = 'Shoppers'; /*这解决了问题*/ 正如您在回答中被告知的那样,为您的专栏提供全名 (<table name>.<column name>) 是一种很好的做法,以节省您和一些读者未来的时间。多年后,当您的“始终工作”的应用程序意外停止工作时,因为有人决定他或她需要另一个表中的同一列,或者您需要猜测,该列是从哪里来的 1000 行脚本中加入了 10 个表 【参考方案1】:

问题出在一行

PHNAME = 'Shoppers';

此查询的表中有两个PHNAME 列,Sells.PhNamePharmacy.PhName。您需要指定要检查的 PHNAME 列中的哪一个 - 所以最后一行应该是

Sells.PHNAME = 'Shoppers';

Pharmacy.PHNAME = 'Shoppers';

【讨论】:

【参考方案2】:

现在您知道另一个答案中正确提到的代码问题。

您需要知道在列之前使用表别名/名称是最重要的事情,否则如果该列存在于@987654321 中使用的多个表中,Oracle 会混淆您指的是哪一列@。

但是有多种方法可以做到JOINs

使用ON 子句,您必须在常用列名之前提供表名/别名。 但是通过USING 子句,Oracle 允许/强制您不要在常用列名之前使用表别名/名称。

ON 子句的示例:(参见代码中的内联 cmets)

SELECT PCOMPANY.CNAME, -- WITH ALIAS NAME OF TABLE PCOMPANY OR SELLS
       PCOMPANY.CPHONE -- ALIAS NAME OF RELEVANT TABLE, PCOMPANY IS ASSUMPTION FOR ME
  FROM PCOMPANY
 INNER JOIN SELLS ON SELLS.CNAME = PCOMPANY.CNAME 
 INNER JOIN PHARMACY ON PHARMACY.PHNAME = SELLS.PHNAME 
 WHERE SELLS.PHNAME = 'Shoppers'; -- WITH ALIAS NAME OF TABLE SELLS/PHARMACY

USING 子句的示例:(参见代码中的内联 cmets)

SELECT CNAME, -- WITHOUT ALIAS NAME OF TABLE AS THIS COLUMN IS USED IN THE USING CLAUSE
       PCOMPANY.CPHONE -- FOLLOW THE PRACTISE OF GIVING TABLE ALIAS NAME
  FROM PCOMPANY
 INNER JOIN SELLS USING (CNAME) -- USED THE USING ON CNAME COLUMN
 INNER JOIN PHARMACY USING (PHNAME) -- USED THE USING ON PHNAME COLUMN
 WHERE PHNAME = 'Shoppers'; -- WITHOUT ALIAS NAME OF TABLE AS THIS COLUMN IS USED IN THE USING CLAUSE

【讨论】:

以上是关于ORA-00918: FOR pharmacyschema.sql (RX 药房数据库) 的列定义不明确的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00918: 列定义不明确,使用 DB Link

不确定为啥会出现 ORA-00918 列定义不明确

ORA-00918: column ambiguously defined

ORA-00918: 列定义不明确

ORA-00918 从存储过程返回,但它可以在 SQL 页面中执行查询

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918