我正在修改一个 SQL 查询,因此它将与数据库无关(因此也可以在 SQL Server 中工作)。这意味着我已将 join-using 替换为 join-on。这有效,但是当我将该子查询放回其父查询时,出现错误。
我在
ORA-00904: study_event_id: invalid identifier
的 SELECT
语句中使用的列的 ON
上出现 JOIN
错误。
下面的代码在出现错误的地方被精简到最少,因此需要尽可能保留子查询和别名。
SELECT
study_event_id
FROM
(
SELECT
*
FROM
(
SELECT
ea.*,
sbj.subject_id
FROM
v_study_event ea,
v_subject sbj
) lefttable
LEFT OUTER JOIN (
SELECT
*
FROM
v_subject_current_event_status
) righttable ON righttable.study_event_id = lefttable.study_event_id
) tbl
我可以选择所有其他列,但无法识别我加入的列。
当我选择 * 时,该列确实出现。
我尝试使用上述所有别名来指定它:tbl、lefttable 和 righttable。
我只是不明白为什么不能选择这一列。
在完整查询中,该列被选择了更多,并且 join-on 语句中有两列。另一列也无法选择,但在完整查询中我不需要再选择该列。
SELECT ea.*,
sbj.subject_id
FROM v_study_event ea,
v_subject sbj
等同于:
SELECT ea.*,
sbj.subject_id
FROM v_study_event ea
CROSS JOIN v_subject sbj
和:
LEFT OUTER JOIN (
SELECT *
FROM v_subject_current_event_status
) righttable
等同于:
LEFT OUTER JOIN v_subject_current_event_status righttable
并且:
SELECT *
FROM ( ... ) tbl
不执行任何操作,可以省略。
您的查询可以简化为(尽管不清楚您想要在
SELECT
子句中包含哪些列):
SELECT se.*,
s.subject_id,
sces.study_event_id
FROM v_study_event se
CROSS JOIN v_subject s
LEFT OUTER JOIN v_subject_current_event_status sces
ON sces.study_event_id = se.study_event_id