2015-02-13 4 views
2

Im пытается получить имена людей, которые никогда не владеют самым популярным автомобилем в каждом типе автомобиля (каждый год для всех автомобилей, SUV, седан .. и т.д.) , Самый популярный автомобиль типа в данном году - производитель и модель с большим количеством зарегистрированных автомобилей, чем любые другие в своем типе.SQL-запрос ORACLE по запросу (ORA-00907: отсутствующие правые скобки)

эти таблицы, которые я создал auto_sale (TRANSACTION_ID, seller_id (грех), buyer_id (грех), vehicle_id (serial_no), s_date (ггггммдд), цена) люди (грех, имя) транспортное средство (serial_no, производитель, модель, год, цвет, тип_ид)

Это вопрос, который я придумал с этой работой dosen't, он продолжает говорить слишком много значений, я пытался иметь псевдонимы для запроса sub в файле 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); 
+0

Какое сообщение об ошибке, точно, что вы получаете? –

+0

ОШИБКА по строке 6: ORA-00907: отсутствующая правая скобка –

+0

В Oracle –

ответ

1

Количество столбцов, которые вы возвращаете из подзапроса, должно соответствовать столбцам, по которым они сравниваются.

... 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) 

Год, кажется, столбец в вашем столе, так что s_date. Не знаю, что вы делаете с года (s_date). Даже если это был действительный синтаксис (а это не так), обе стороны уравнения одинаковы, что означает, что предложение WHERE там не требуется. Вероятно, вы хотите, чтобы псевдоним таблиц на каждом уровне и соответствовал соответствующим условиям.

Люди и auto_sale пересекаются в запросе верхнего уровня. Не уверен, что это правильно.

+0

, но теперь это говоря ОШИБКА в строке 6: ORA-00907: отсутствует правая скобка –

2

Сначала я писал все изменения, которые я делал, чтобы исправить вашу синтаксическую проблему, но потом, когда я понял, что это самый длинный ответ, который я когда-либо писал, и что никакая его часть не была действительно поучительной, я решил просто скопируйте здесь фиксированный запрос.

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; 

Я понятия не имею, как у вас было так много проблем с синтаксисом. Вот некоторые чаевые, чтобы избежать проблем синтаксиса:

  • Написать код в редакторе, который предупредит вас, когда ваш синтаксис странно
  • Убедитесь, что отступы ваш код правильно
  • Используйте тот же редактор, как и все в вашей команде так что разные люди, работающие над одним и тем же кодом, не нарушают синтаксис
  • Некоторые редакторы (например, жаба) позволяют определить шаблон формата. Когда вы закончите запись запроса, вы можете просто щелкнуть по нему, чтобы иметь читаемый синтаксис, который позволит вам долго отлаживать вас.

Обратите внимание, что я не проверял правильность логики запроса, просто решил исправить все проблемы синтаксиса, поскольку это ваша первоначальная проблема. Я предполагаю, что все хорошо.

+0

У меня есть много проблем с синтаксисом, потому что я только начал изучать ха-ха, я обычно просто набираю его в emacs и запускаю его в sqlplus, но теперь я загрузил sql-разработчик , надеюсь, что это поможет мне больше в синтаксических проблемах. –

+0

спасибо за ваш совет, я уже немного изменил свои кодировки, теперь он работает. –

+0

ах, а просто для отступов, я не знаю, почему, когда я копирую здесь , он меняет его –

Смежные вопросы