Oracle子查询返回错误

时间:2018-08-22 17:59:04

标签: sql oracle oracle11g

我正在下面的查询中,我想为每个候选人向外部查询返回一个日期列(DATE1)。由于每个候选人可以有多个日期条目,因此我希望它返回存在的多个条目。

我遇到上述错误,而其他时候我得到

  

ORA-00933:SQL命令未正确结束
  00933. 00000-“ SQL命令未正确结束”

SELECT DISTINCT xyf.can_num, 
                xyf.associate_id, 
                event_f.pi_his_itm_app_trk_creation_dt, 
                xyf.offer_accepted_date, 
                xyf.conversion_hire_date, 
                xyf.parent_pi_number, 
                information_d.job_sub_family_name, 
                information_d.job_family_name, 
                event_f.contest_number, 
                xyf.full_time_offer_location, 
                xyf.associate_name 
FROM            ( 
                       SELECT * 
                       FROM   ( 
                                         SELECT     event_f.pi_his_itm_app_trk_creation_dt 
                                         FROM       event_f 
                                         inner join xyf 
                                         ON         xyf.can_num = event_f.can_num 
                                         inner join information_d 
                                         ON         event_f.job_info_row_wid = information_d.row_wid
                                         WHERE      information_d.job_family_name IN ('MP', 
                                                                                      'PLE', 
                                                                                      'EP', 
                                                                                      'Other') 
                                         AND        event_f.pi_his_itm_app_trk_sts_name = 'Extended'
                                         AND        event_f.pi_his_itm_app_trk_step_name = 'Offer'
                                         AND        information_d.title NOT IN ('Student Ambassador Program for Eligible Summer Interns',
                                                                                'Student Ambassador')
                                         AND        event_f.pi_his_itm_app_trk_sts_name = 'Extended'
                                         AND        event_f.pi_his_itm_app_trk_step_name = 'Offer')) AS date1
from            xyf 
inner join      event_f 
ON              xyf.can_num = event_f.can_num 
inner join      information_d 
ON              event_f.job_info_row_wid = information_d.row_wid 
WHERE           information_d.job_family_name IN ('MP', 
                                                  'PLE', 
                                                  'EP', 
                                                  'Other') 
AND             event_f.pi_his_itm_app_trk_sts_name = 'Extended' 
AND             event_f.pi_his_itm_app_trk_step_name = 'Offer' 
AND             information_d.title NOT IN ('Student Ambassador Program for Eligible Summer Interns',
                                            'Student Ambassador');

1 个答案:

答案 0 :(得分:2)

最初的ORA-00933是由于AS date1(目前是表别名and you can't use AS for those in Oracle)引起的。

但是您还具有两个from子句,由于它不希望第二个子句,因此将导致另一个ORA-00933。

根据您的描述,将date1称为日期,实际上意味着该子查询是列表达式,而不是内联视图。所以也许您真的想要这样的东西:

...
                xyf.associate_name, 
                (
                       SELECT     event_f.pi_his_itm_app_trk_creation_dt 
                       FROM       event_f 
                       inner join xyf 
                       ON         xyf.can_num = event_f.can_num 
                       inner join information_d 
                       ON         event_f.job_info_row_wid = information_d.row_wid
                       WHERE      information_d.job_family_name IN ('MP', 
                                                                    'PLE', 
                                                                    'EP', 
                                                                    'Other') 
                       AND        event_f.pi_his_itm_app_trk_sts_name = 'Extended'
                       AND        event_f.pi_his_itm_app_trk_step_name = 'Offer'
                       AND        information_d.title NOT IN ('Student Ambassador Program for Eligible Summer Interns',
                                                              'Student Ambassador')
                ) AS date1
from            xyf 
...

我删除了第一个FROM并在前一行添加了逗号;并删除了多余的内部子查询和重复的过滤器。

整个查询是否有意义,或者这是否是获取日期值的最有效方法,是另一回事。子查询看起来非常类似于外部查询,因此我不确定为什么不直接在外部查询中引用您想要的列:

...
                xyf.associate_name, 
                event_f.pi_his_itm_app_trk_creation_dt as date1
from            xyf 
...

您可能有一个使用子查询的原因,以及将其与外部查询行关联的一种方法,但这对我来说并不明显。


  

当外部查询预期为单行时,我遇到的上一个错误是查询返回多行

那是因为外部查询和子查询之间没有关联。如果您单独运行子查询,则可能会返回多行,并且您正在为外部查询中的每一行运行该行,并尝试包括所有这些行。标量列表达式中不能有多行,因此会出现“ ORA-01427:单行子查询返回多个行”错误。您或者需要添加一些相关性-如果更改子查询中的表别名以使其与外部查询不同,这将更加简单-如果实际上不需要子查询,则将其完全删除(请参见上文)。 / p>