ORA-00904 при использовании OUTER JOIN с 3 таблицами в предложении

SELECT 
   s.session_name semester
FROM 
   lsx.elsp_session s,
   lsx.elsp_course_offering co,
   its.ACCOUNT ac
LEFT OUTER JOIN lsx.elsp_class_attendance ca on ca.course_id = CO.ID and ca.student_number = ac.id
WHERE co.session_id = s.session_id

Я получаю сообщение об ошибке ORA-00904, и проблема, похоже, в том, что "CO.ID" является недопустимым идентификатором. Однако, если я поставлю таблицу "lsx.elsp_course_offering co" последней в списке FROM, тогда "ac.id" станет идентификатором проблемы.

Нельзя ли использовать другую таблицу в предложении JOIN? Кажется, я припоминаю создание успешных запросов, подобных этому, с использованием MySQL.

Я использую Oracle 9.2.0.8.0.

Следуя полученному совету, я смог заставить соединение работать, как и ожидалось, когда я переработал запрос следующим образом:

SELECT s.session_name semester FROM lsx.elsp_session s
  INNER JOIN lsx.elsp_course_offering co
    ON co.session_id = s.session_id
  LEFT OUTER JOIN lsx.elsp_class_attendance ca
    ON ca.course_id = co.id
  LEFT OUTER JOIN its.account ac
    ON ca.student_number = ac.id

Большое спасибо за вашу помощь.


person Andy Flanagan    schedule 14.10.2013    source источник
comment
Лично мне не нравится, как ты это делаешь. Я вижу внутреннее соединение (s с co), перекрестное соединение (с ac) и одно левое внешнее соединение (с ca). Не используйте запятые для соединений, используйте соответствующее предложение соединения.   -  person Giannis Paraskevopoulos    schedule 14.10.2013
comment
Спасибо за внимание - по сути, мне нужно присоединиться к таблице lsx.elsp_class_attendance как для student_id, так и для course_id, но данных о посещаемости может не быть, поэтому необходимо внешнее соединение.   -  person Andy Flanagan    schedule 14.10.2013


Ответы (1)


Возможно, вы неправильно поняли комментарий выше. Обычно люди не смешивают несколько таблиц FROM с синтаксисом JOIN.

Я думаю, что вы должны написать это так, а не. Следовать этому пути должно быть легче.

SELECT s.session_name semester
FROM lsx.elsp_session s
  INNER JOIN lsx.elsp_course_offering co
    ON co.session_id = s.session_id
  INNER JOIN its.account ac
    ON ca.student_number = ac.id
  LEFT OUTER JOIN lsx.elsp_class_attendance ca
    ON ca.course_id = co.id

а затем посмотрите, есть ли у вас синтаксические ошибки.

person MJB    schedule 14.10.2013