2013-02-27 147 views
0

以下代碼是已經仍可產生語法錯誤減少的樣品:甲骨文語法錯誤

ORA-00904: "R"."READING_TIME": invalid identifier

SELECT r.user_id, rm.reading_time start_time, r.reading_time end_time 
FROM Readings r 
INNER JOIN (
     SELECT r2.user_id, r2.reading_time, r2.x, r2.y 
     FROM Readings r2 
     WHERE r2.user_id=r.user_id and 
      r2.reading_time < r.reading_time 
    ) rm 
ON r.user_id=rm.user_id; 

爲什麼具有內部查詢問題的別名外部查詢?

鏈接到我的小提琴:http://sqlfiddle.com/#!4/0d4b5/21

UPDATE: 我做自聯接和移動相關的查詢ON條款解決了這個問題。

更新撥弄着整個腳本:http://sqlfiddle.com/#!4/39032/10

+0

因爲你不能加入子查詢。這是Hamlet糾正的語法錯誤。 – Art 2013-02-27 22:10:05

+1

[SQL查詢時間間隔的可能重複。語法錯誤。](http://stackoverflow.com/questions/15100254/sql-query-for-time-intervals-syntax-errors) – 2013-02-27 22:14:14

+0

@ ypercube - 你說得對。我正在將SQL Server 2008中的查詢重寫爲Oracle 11g。 – 2013-02-27 22:25:00

回答

2

的「RM」內聯視圖具有到外查詢列中沒有訪問權限,因此r.user_idr.reading_time不能在內部查詢被引用。你必須在外面過濾:

SELECT r.user_id, rm.reading_time start_time, r.reading_time end_time 
FROM Readings r 
INNER JOIN (
     SELECT r2.user_id, r2.reading_time, r2.x, r2.y 
     FROM Readings r2 
    ) rm 
ON rm.user_id=r.user_id 
AND rm.reading_time < r.reading_time; 
+0

所以我不能在這裏使用相關的子查詢? – 2013-02-27 22:32:42

+0

相關的子查詢就是where子句中的子查詢引用父項from子句中的一個表的地方 - 但這種情況在這裏不適用。我重寫了你的查詢是正確的方式,即你有內聯視圖之外的連接(在這個微不足道的例子中,我們可以簡化爲與hamlet發佈的內容相同,但我認爲你的真實SQL更復雜) – DazzaL 2013-02-27 22:48:26

+0

作爲** ON **表達式的一部分,我可以有相關的子查詢嗎? – 2013-02-27 23:03:19

1

不能從加盟到另一部分的一個部分參考。

你在找這個嗎?

SELECT r.user_id, r2.reading_time start_time, r.reading_time end_time 
FROM Readings r 
INNER JOIN Readings r2 
ON r.user_id=r2.user_id 
    AND r2.reading_time < r.reading_time; 

SQL FIDDLE

+0

我的代碼目前沒有任何意義。這只是一個簡化的示例,試圖本地化語法錯誤​​的來源。 – 2013-02-27 22:10:29

+0

@ PM77-1查看更新。 – 2013-02-27 22:11:18