Oracle-Nested和Joins

时间:2018-05-10 07:13:13

标签: oracle

问题陈述

编写查询以显示正在运送到“Chennai”或“Cochin”端口的shipment_entity详细信息。显示基于id的升序排序的记录。

预期产出

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 :(得分:0)

您的问题是您已将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 ...

顺便提一下,如果您学习使用间距和换行符来使布局更清晰,那么您将使自己的生活变得更轻松 - 以及其他读取您代码的人的生活。这并不挑剔:可读性是我们的代码所需的功能,因为它使维护和调试更容易。

答案 1 :(得分:0)

您需要删除,装运s,端口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');

答案 2 :(得分:0)

您正在使用传统的oracle和ansi语法。使用传统语法时,您不需要显式"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');