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.PhName
和Pharmacy.PhName
。您需要指定要检查的 PHNAME
列中的哪一个 - 所以最后一行应该是
Sells.PHNAME = 'Shoppers';
或
Pharmacy.PHNAME = 'Shoppers';
【讨论】:
【参考方案2】:现在您知道另一个答案中正确提到的代码问题。
您需要知道在列之前使用表别名/名称是最重要的事情,否则如果该列存在于@987654321 中使用的多个表中,Oracle 会混淆您指的是哪一列@。
但是有多种方法可以做到JOIN
s
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: column ambiguously defined