繁体   English   中英

SQL ORACLE有关查询的帮助(ORA-00907:缺少右括号)

[英]SQL ORACLE help on query(ORA-00907: missing right parenthesis)

我试图获得从未拥有每种汽车中最受欢迎的汽车的人的名字(每年所有汽车,suv,sedan..etc)。 在给定年份中最流行的一种类型的车辆是制造商和型号,其注册车辆数量超过该类型的任何其他车型。

这些是我创建的表auto_sale(transaction_id,seller_id(sin),Buyer_id(sin),vehicle_id(serial_no),s_date(yyyymmdd),price)人(sin,name)车辆(serial_no,制造商,型号,年份,颜色,type_id)

这是我想不到的查询,它一直在说太多的值,我尝试在vehicle.maker / model =(...)中为子查询添加别名,以澄清联接的表,但是它一直在说缺少正确的括号,因此请向我展示一下此查询。

select people.name
from auto_sale,people
where name not in(select people.name from people,auto_sale,vehicle where buyer_id = people.sin and
                  auto_sale.vehicle_id=vehicle.serial_no and
                  vehicle.maker = (select vehicle.maker
                                from (auto_sale
                                     join
                                     vehicle
                                     on auto_sale.vehicle_id = vehicle.serial_no)v1
                                group by extract(year from to_date(v1.s_date,'yyyymmdd'), maker
                                having count(*) >= all(select count(*)
                                                       from (auto_sale
                                                       join
                                                       vehicle
                                                       on auto_sale.vehicle_id = vehicle.serial_no)v2
                                                       where extract(year from to_date(v1.s_date,'yyyymmdd')=
                                                       extract(year from to_date(v2.s_date,'yyyymmdd')
                                                       group by extract(year from to_date(v2.s_date,'yyyymmdd'),ma\
ker,type_id) ) and
                  vehicle.model = (select vehicle.model
                                from (auto_sale
                                     join
                                     vehicle
                                     on auto_sale.vehicle_id = vehicle.serial_no)v3
                                group by extract(year from todate(v3.s_date,'yyyymmdd'), model
                                having count(*) >= all(select count(*)
                                                       from (auto_sale
                                                       join
                                                       vehicle
                                                       on auto_sale.vehicle_id = vehicle.serial_no)v4
                                                       where extract(year from to_date(v3.s_date,'yyyymmdd')=
                                                       extract(year from to_date(v4.s_date,'yyyymmdd')
                                                       group by extract(year from to_date(s_date,'yyyymmdd'),v4mod\
el,v4.type_id))
                   group by people.name);

刚开始时,我正在写所有为解决您的语法问题所做的修改,但是当我意识到这是我写过的最长答案,并且其中的任何部分都没有真正的指导意义时,我决定只在此处复制此修订查询。

select people.name
from auto_sale,people
where name not in(select people.name 
                    from people,
                         auto_sale,
                         vehicle 
                    where buyer_id = people.sin 
                      and auto_sale.vehicle_id = vehicle.serial_no
                      and vehicle.maker = (select vehicle.maker
                                            from auto_sale
                                            join vehicle on auto_sale.vehicle_id = vehicle.serial_no v1
                                            group by extract(year from to_date(v1.s_date,'yyyymmdd')), maker
                                            having count(*) >= all(select count(*)
                                                                        from auto_sale
                                                                        join vehicle on auto_sale.vehicle_id = vehicle.serial_no v2
                                                                        where extract(year from to_date(v1.s_date,'yyyymmdd')) = extract(year from to_date(v2.s_date,'yyyymmdd'))
                                                                        group by extract(year from to_date(v2.s_date,'yyyymmdd'),maker,type_id))) 
                      and vehicle.model = (select vehicle.model
                                            from auto_sale
                                            join vehicle on auto_sale.vehicle_id = vehicle.serial_no v3
                                            group by extract(year from todate(v3.s_date,'yyyymmdd')), model
                                            having count(*) >= all(select count(*)
                                                                    from auto_sale
                                                                    join vehicle on auto_sale.vehicle_id = vehicle.serial_no) v4
                                            where extract(year from to_date(v3.s_date,'yyyymmdd'))= extract(year from to_date(v4.s_date,'yyyymmdd'))
                                            group by extract(year from to_date(s_date,'yyyymmdd')),v4.model,v4.type_id))
group by people.name;

我不知道您怎么能遇到这么多语法问题。 这里有一些避免语法问题的提示:

  • 在编辑器中编写代码,以在语法奇怪时警告您
  • 确保正确缩进代码
  • 使用与团队中所有人相同的编辑器,以便使用同一代码的不同人员不会破坏语法
  • 一些编辑器(例如toad)允许定义格式模板。 完成查询的编写后,您只需单击格式即可获得可读的语法,这将节省您大量的调试时间。

请注意,我没有检查查询逻辑是否良好,只是确保解决所有语法问题,因为这是您的最初问题。 我在这里假设其余的都很好。

您从子查询返回的列数应与它们要比较的列匹配。

...  and 
      vehicle.maker = (select year(auto_sale.s_date), vehicle.maker
                        from 
...

也,

... and
      vehicle.model = (select year(auto_sale.s_date), vehicle.model
                            from
...

而是应该像

... vehicle.maker = (select  vehicle.maker from ...

要记住的一点是,当与'='一起使用时,子查询应该只返回1行。

编辑:第二,使用此sql,有很多东西看起来不正确。

where year(s_date)=year(s_date)

Year似乎是表中的一列,s_date也是如此。 不知道您用year(s_date)完成的工作。 即使它是有效的语法(不是),等式的两边都相同,这意味着在那里不需要WHERE子句。 您可能希望为每个级别的表加上别名,并相应地使用条件。

人员和auto_sale在顶级查询中交叉连接。 不确定是否正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM