任何人都可以帮我解释以下声明。我是SQL的新手,可能忽略了显而易见的事情。
我正在尝试运行以下查询 有一个货运表与相应的列(PROJECTNO,SUPPLIERNO) 我知道我不会把货物放进去。在名称前面,但这最终会在多表查询中结束。
SELECT sup1.SHIPMENTS.PROJECTNO, sup2.SHIPMENTS.PROJECTNO
FROM SHIPMENTS sup1, SHIPMENTS sup2
WHERE sup1.SHIPMENTS.PROJECTNO = sup2.SHIPMENTS.PROJECTNO
AND sup1.SHIPMENTS.SUPPLIERNO <> sup2.SHIPMENTS.SUPPLIERNO;
我一直收到以下错误。
ORA-00904: "SUP2"."SHIPMENTS"."SUPPLIERNO": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause: *Action: Error at Line: 160 Column: 34
提前谢谢
答案 0 :(得分:1)
将所有 sup2.SHIPMENTS.SUPPLIERNO 更改为 sup2.SUPPLIERNO ,并对sup1别名和其他colummns执行相同操作。
您必须了解别名。将表TAB别名为T后,您应该将其称为T。
在你的FROM子句中,当你说
时 FROM SHIPMENTS sup1, SHIPMENTS sup2
您将SHIPMENTS表别名为sup1和sup2(作为同一个表的2个实例)。因此,您需要使用sup1和sup2作为表名,并且真实姓名(SHIPMENTS)不是有效的,并且无论如何都是不明确的,因此请使用:
sup1.SUPPLIERNO --refers to SUPPLIERNO column in SHIPMENTS table aliased as sup1
sup2.PRODUCTNO --refers to PRODUCTNO column in SHIPMENTS table aliased as sup2
没有sup2.SHIPMENTS.SUPPLIERNO这样的东西,因为没有sup2.SHIPMENTS表这样的东西
另外,要记住一般规则,在Oracle中,您可以使用table.column,schema.table或schema.table.column等表示法来引用表/视图或列。在这种情况下,您所写的内容相当于table.table.column,这是没有意义的(除非您使用的是嵌套表)。
你必须在这里使用别名的原因是它是将表连接到自身的唯一方法。如果您使用两次完整的表名,则会出现歧义错误。当您自行加入表时,Oracle会将每个实例(别名)视为查询中的不同表。我更喜欢使用像a和b这样的别名来减少拼写错误。
SELECT a.PROJECTNO, b.PROJECTNO
FROM SHIPMENTS a JOIN SHIPMENTS b USING(PROJECTNO)
WHERE a.SUPPLIERNO <> b.SUPPLIERNO;
答案 1 :(得分:1)
您的查询应写为:
SELECT sup1.PROJECTNO, sup2.PROJECTNO
FROM SHIPMENTS sup1 JOIN
SHIPMENTS sup2
on sup1.PROJECTNO = sup2.SHIPMENTS.PROJECTNO AND
sup1.SUPPLIERNO <> sup2.SUPPLIERNO;
首先,使用别名时,无需再次指定表名。此外,您应该使用带有join
条件的显式on
语法。支持具有where
子句中的条件的隐式语法,但它的功能较弱且难以阅读。