2015-11-22 27 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” –