2014-11-06 46 views
0

我在尝试使用JOIN方法解决此问题时遇到了一些问题。也许我没有使用正确类型的JOIN?我得到的查询执行罚款时,我用传统的方法,语法,其中如下所示:Oracle ORA-0095:缺少关键字

SELECT cr.criminal_id, cr.last, cr.first, c.classification, c.date_charged, cc.crime_code, 
cc.fine_amount 
FROM criminals cr, crimes c, crime_charges cc 
WHERE classification = 'O' 
ORDER BY cr.criminal_id, c.date_charged; 

但是当我尝试使用JOIN方法我得到ORA-0095说,一个错误:缺少关键字。我认为这是因为我没有足够具体的JOIN关键字?但我不知道我应该把它放在什么前面(如果有的话)。这里是一个的给我的错误代码:

SELECT cr.criminal_id, cr.last, cr.first, c.classification, c.date_charged, cc.crime_code 
cc.fine_amount 
FROM criminals cr JOIN crimes c (using criminal_id) 
JOIN crime_charges cc (using crime_id) 
WHERE classification = 'O' 
ORDER BY cr.criminal_id, c.date_charged; 

的问题说,我应该列出我已经在SELECT语句已选择的列,然后只包括归类为“其他”罪行(由'O'指定)。然后,我只是应该按犯罪编号和日期组织名单。相当基本的东西(这就是为什么它让我疯狂,我无法让它工作!)。

+1

你的“传统方法”不加入任何东西;它只是从不同的表中选择不相关的列。如果你使用的是Oracle,那么MySQL和SQL Server标签是不适用的 - 它们是完全不同的产品,而这三者是**不等同的。使用实际适用于您的问题的标签。如果您不确定,请在使用前阅读标签说明。在本网站搜索'[oracle] JOIN'(包括括号) - 有很多现有的问题提供了正确的语法示例。这里...让我为你做。 – 2014-11-06 01:42:31

回答

2

我怀疑问题是在using之前的括号。列列表放在括号内。另外,您在cc.fine_amount之前缺少一个逗号。试试这个:

SELECT criminal_id, cr.last, cr.first, c.classification, c.date_charged, 
     cc.crime_code, cc.fine_amount 
FROM criminals cr JOIN 
    crimes c 
    using (criminal_id) JOIN 
    crime_charges cc 
    using (crime_id) 
WHERE c.classification = 'O' 
ORDER BY criminal_id, c.date_charged; 

Here是一个较小的查询错误的例子。

+0

非常感谢!这几乎是正确的,除了它说我在使用USING子句时不能使用列限定符。但是,这确实帮助我找出了正确的解决方案,所以我正在对它进行评估。再次感谢! – 2014-11-06 13:12:56

+0

@TomMcNish。 。 。我尝试在任何具有“连接”的表中使用表别名。 'using'子句不允许这样做,所以它需要关注查询。 – 2014-11-06 18:49:25

0

您的第一个查询不是JOIN,它应该返回这3个表的笛卡尔乘积。 您必须在WHERE子句之后指定条件,以使其成为JOIN查询。

您可以参考下面的使用ON/USING子句的JOIN。

USING clause in oracle 11g