内部或外部左侧加入

时间:2012-09-06 15:28:08

标签: oracle oracle11g

我很难修改这种情况的脚本,并想知道是否有人可以提供帮助:

我有一个address表和一个phone表,它们共享同一列id_number。因此,两个表上的id_number = 2指的是同一个实体。地址和电话信息曾经存储在一个表(address表)中,但现在已经拆分为addressphone表,因为我们已转移到Oracle 11g。

有一个名为both_ids的第3个表。除了存储id_number的{​​{1}}列以及其他一些ID外,此表还有一个other_ids列。

在将表拆分为SSNaddress表之前,我有这个脚本: (用Sybase编写)

phone

现在我们转移到了Oracle 11g,地址和电话信息被拆分了。

如何修改上述脚本以在Oracle 11g中生成相同的结果?

我是否必须先在地址和电话表之间进行INNER JOIN,然后对Both_ids进行LEFT OUTER JOIN?

我尝试了以下操作并且无效:

INSERT INTO sometable_3 (          
SELECT a.id_number, a.other_id, 
       NVL(a1.addr_type_code,0)      home_addr_type_code,             
       NVL(a1.addr_status_code,0)    home_addr_status_code,             
       NVL(a1.addr_pref_ind,0)      home_addr_pref_ind,             
       NVL(a1.street1,0)             home_street1,             
       NVL(a1.street2,0)              home_street2,             
       NVL(a1.street3,0)              home_street3,             
       NVL(a1.city,0)                 home_city,             
       NVL(a1.state_code,0)           home_state_code,             
       NVL(a1.zipcode,0)              home_zipcode,             
       NVL(a1.zip_suffix,0)           home_zip_suffix,             
       NVL(a1.telephone_status_code,0) home_phone_status,             
       NVL(a1.area_code,0)             home_area_code,             
       NVL(a1.telephone_number,0)      home_phone_number,             
       NVL(a1.extension,0)             home_phone_extension,             
       NVL(a1.date_modified,'')      home_date_modified               
 FROM both_ids a, address a1          
 WHERE a.id_number = a1.id_number(+) 
 AND a1.addr_type_code = 'H');   

1 个答案:

答案 0 :(得分:1)

您的查询中存在语法错误。您在下面的评论中写道,您的查询是:

 ..
 FROM address a1 JOIN telephone t ON a1.id_number = t.id_number
 AND RIGHT OUTER JOIN tt_gl_both_ids a ON a.id_number = a1.id_number
 WHERE
 ..

抛出AND,它会起作用。另外,用左外连接替换右外连接,因为这是你想要实现的(同样,根据你写的评论)。