内部联接切换到外部,无效的标识符

Dob*_*eim 2 oracle inner-join outer-join

所以我正在玩几个连接查询,我注意到一些不寻常的行为,当我将查询从内部连接切换到外部连接,并将其他所有内容保持不变时,我收到错误,下面是两个查询正在运行.

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
FROM Staff INNER JOIN Booking ON Staff.StaffID = Booking.StaffID;
Run Code Online (Sandbox Code Playgroud)

SQL查询成功返回的屏幕截图

然后当我切换它时,

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
FROM Staff OUTER JOIN Booking ON Staff.StaffID = Booking.StaffID;
Run Code Online (Sandbox Code Playgroud)

我得到Error ORA-00904 Invalid identifier "Staff"."StaffID".

我认为上述查询应该返回所有已预订的工作人员以及所有未预订的人员.

有任何想法吗?

Joe*_*Joe 5

问题是你需要声明LEFT OUTER JOIN(或FULL或RIGHT)而不是OUTER JOIN.Oracle OUTER在您的SQL中将其视为表别名.也就是说,它正在读作:

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
  FROM Staff foo 
        JOIN Booking ON Staff.StaffID = Booking.StaffID;
Run Code Online (Sandbox Code Playgroud)

虽然看起来很奇怪,但这实际上会起作用:

SELECT OUTER.Fname AS "First Name", OUTER.Lname AS "Second Name", Booking_ID
  FROM Staff OUTER JOIN Booking ON OUTER.StaffID = Booking.StaffID;
Run Code Online (Sandbox Code Playgroud)

Oracle会将此视为STAFF表(别名为OUTER)和BOOKING之间的简单内部联接.

从本质上讲,它OUTER是一个关键字,但不是Oracle中的保留字.也就是说,它具有特殊含义,但仍可用作别名.

  • 解决方法是使用FULL OUTER JOIN,RIGHT OUTER JOIN或LEFT OUTER JOIN而不是OUTER JOIN,具体取决于他使用外连接的具体方式.Oracle SQL非常有趣 (2认同)