Oracle-вложенные и объединения - PullRequest
0 голосов
/ 10 мая 2018

Постановка задачи

Напишите запрос для отображения деталей shipment_entity, которые отправляются в порт «Ченнай» или «Кочин». Показать записи, отсортированные в порядке возрастания на основе идентификатора.

Ожидаемый результат

select se.id, 
       se.name, 
       se.contact_first_name,  
       se.contact_last_name, 
       se.identification_number, 
       se.credit_limit, 
       se.is_active,s 
       e.address_id
from shipment_entity se, 
       shipment s, 
       port p 
inner join shipment s on se.id = s.shipment_entity_id 
inner join port p on s.departure_port_id=p.id  
where p.name in ('Chennai','Cochin');

ОШИБКА SQL:

отправка с внутренним соединением на se.id = s.shipment_entity_id
*
ОШИБКА в строке 3: ORA-00904: «SE». «ID»: неверный идентификатор

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Необходимо удалить, отгрузка с, порт p

select se.id,se.name,se.contact_first_name,se.contact_last_name,se.identification_number,se.credit_limit,se.is_active,se.address_id
from shipment_entity se ##### you need to remove this-> ,shipment s,port p 
inner join shipment s on se.id = s.shipment_entity_id 
inner join port p on s.departure_port_id=p.id where p.name in ('Chennai','Cochin');
0 голосов
/ 10 мая 2018

Вы используете как обычный оракул, так и анси-синтаксис. При использовании обычного синтаксиса вам не требуется явное предложение "JOIN" и "ON". Аналогично, если вы используете Ansi-синтаксис, вам не следует указывать все таблицы в предложении FROM.

Пожалуйста, попробуйте любой из следующих запросов:

Обычная:

select se.id, 
       se.name, 
       se.contact_first_name,  
       se.contact_last_name, 
       se.identification_number, 
       se.credit_limit, 
       se.is_active,s 
       e.address_id
from shipment_entity se, 
       shipment s, 
       port p 
where  se.id = s.shipment_entity_id 
and s.departure_port_id=p.id  
and  p.name in ('Chennai','Cochin');

ANSI:

select se.id, 
       se.name, 
       se.contact_first_name,  
       se.contact_last_name, 
       se.identification_number, 
       se.credit_limit, 
       se.is_active,s 
       e.address_id
from shipment_entity se
join  shipment s
on  se.id = s.shipment_entity_id 
join port p 
on s.departure_port_id=p.id  
where p.name in ('Chennai','Cochin');
0 голосов
/ 10 мая 2018

Ваша проблема в том, что вы объединили синтаксис pre-ANSI 92 с явным синтаксисом соединения.Вам нужно только один раз включить таблицы в предложение FROM:

...
from shipment_entity se
     inner join shipment s on se.id = s.shipment_entity_id 
     inner join port p on s.departure_port_id=p.id 
where ...

Кстати, вы упростите свою собственную жизнь - так же, как и жизнь тех, кто читает ваш код - если вы научитесь использовать интервалыи разрывы строк, чтобы сделать макет более четким.Это не суета: удобочитаемость - это функция, которая нужна нашему коду, потому что она упрощает обслуживание и отладку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...