【问题标题】:Inner join switch to outer, invalid identifier内部连接切换到外部,无效标识符
【发布时间】:2014-06-08 17:20:32
【问题描述】:

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

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
FROM Staff INNER JOIN Booking ON Staff.StaffID = Booking.StaffID;

然后当我切换它时,

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
FROM Staff OUTER JOIN Booking ON Staff.StaffID = Booking.StaffID;

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

我认为上面的查询应该返回所有已经预订的员工以及 bookingid,以及所有没有预订的员工。

有什么想法吗?

【问题讨论】:

  • 如果切换回INNER JOIN,查询还能用吗?
  • 您是否有理由为此数据需要外部联接?同时查看两个表的表结构可能会有所帮助
  • 是的,当切换回 Joseph 时,查询仍然有效。
  • 我想还有其他方法可以询问此查询,但我对为什么此特定查询无法使用 Marshall 感兴趣。
  • 另外,为了清楚起见,您应该在 Booking_ID 前面放一张桌子

标签: oracle inner-join outer-join


【解决方案1】:

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

SELECT Staff.Fname AS "First Name", Staff.Lname AS "Second Name", Booking_ID
  FROM Staff foo 
        JOIN Booking ON Staff.StaffID = Booking.StaffID;

虽然看起来很奇怪,但这确实可行:

SELECT OUTER.Fname AS "First Name", OUTER.Lname AS "Second Name", Booking_ID
  FROM Staff OUTER JOIN Booking ON OUTER.StaffID = Booking.StaffID;

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

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

【讨论】:

  • 修复方法是使用 FULL OUTER JOIN、RIGHT OUTER JOIN 或 LEFT OUTER JOIN 而不是 OUTER JOIN,具体取决于他使用外部联接的确切含义。 Oracle SQL 太有趣了
  • 很好,一旦它允许我(4 分钟),我会接受这个作为答案。我想知道为什么当我查找这个时 google 会抛出这么多与别名相关的问题!
  • @MarshallTigerus 是的,你是对的。我只是想左。我更新了我的答案以包括 FULL 和 OUTER。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多