![](/img/trans.png)
[英]Oracle: Dynamic SQL query error for subquery right parenthesis(ORA-00907: missing right parenthesis)
[英]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;
我不知道您怎么能遇到这么多语法问题。 这里有一些避免语法问题的提示:
请注意,我没有检查查询逻辑是否良好,只是确保解决所有语法问题,因为这是您的最初问题。 我在这里假设其余的都很好。
您从子查询返回的列数应与它们要比较的列匹配。
... 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.