SQL并查找与条件不匹配的记录

时间:2014-06-29 17:48:45

标签: sql oracle

任何人都可以帮我解释以下声明。我是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

提前谢谢

2 个答案:

答案 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子句中的条件的隐式语法,但它的功能较弱且难以阅读。