2015-11-22 43 views
0
SELECT D1.DISTRICT_NAME, E1.EMP_FNAME, E1.EMP_LNAME, T1.TAX_YEAR, T1.DATE_LAST_CALC 
FROM DISTRICT AS D1, EMPLOYEE AS E1, TOTAL_PAB AS T1 
WHERE T1.DATE_LAST_CALC BETWEEN '2015-04-01' AND '2015-04-04' 
OR '2015-06-01' - T1.DATE_LAST_CALC > 175 
ORDER BY DISTRICT_NAME, EMP_LNAME; 

我試圖在Oracle中創建一個視圖。在Oracle中查看 - 語法錯誤

編寫查詢(並保存爲視圖)以顯示需要重新計算其TOTAL_PAB的所有員工。 如果他們的DATE_LAST_CALC在2015年4月1日到2015年4月4日之間 (此時存在病毒報告,因此他們想重新計算這些數據)或者2015年6月1日(財政年初年),DATE_LAST_CALC大於175天。按 區的名稱排序,然後按員工的姓氏排序

當我嘗試運行此操作時,得到ORA-00933: SQL command not properly ended。我不知道語法有什麼問題。請任何幫助。

+0

你肯定從甲骨文另一個日期減去的日期得到的天數?爲什麼它會產生幾天而不是幾秒鐘?或者就此而言,這是一個晚上? –

+2

@MikeNakis:是的,這是如何在Oracle中定義(並明確記錄) –

+1

是的,它表示日期以天爲單位存儲。 –

回答

5

Oracle不支持對錶的別名AS關鍵字,因此

from district as d1, employee as e1, total_pab as t1 

需求是:

from district d1, employee e1, total_pab t1 

但是,查詢有更多的問題。

因爲你使用的是過時的,古老的隱含的加入where子句中,你不會注意到你錯過了三個表的連接條件。

如果你重寫這個使用適當JOIN運營商這立即得到可見:

SELECT d1.district_name, e1.emp_fname, e1.emp_lname, t1.tax_year, t1.date_last_calc 
FROM district d1 
    JOIN employee e1 ON ????? 
    JOIN total_pab t1 ON ????? 

而且條件:or '2015-06-01' - t1.date_last_calc > 175是一個錯誤發生等。 '2015-06-01'不是date值,它是一個字符串常量,它是隱含地轉換爲日期的。最好使用明確的date值。無論是使用標準的SQL文本:

date '2015-06-01' - t1.date_last_calc > 175` 

或使用Oracle的to_date()功能:

to_date('2015-06-01', 'yyyy-mm-dd') - t1.date_last_calc > 175` is a bug 

這同樣適用於你的between條件爲真。


也沒有理由寫一切在大寫在SQL

+0

@apc:查詢中沒有「distinct」 –