2012-09-06 109 views
2

我有難度修改腳本,針對這種情況,不知道是否有人也許能幫助:內部或外部LEFT JOIN

我有一個address表和phone表都共享稱爲id_number同一列。所以兩個表上的id_number = 2指的是同一個實體。地址和電話信息過去一直保存在一張表中(address表),但自從我們轉移到Oracle 11g以來,它現在分成addressphone表。

有一個名爲both_ids的第三個表。此表格除了存儲SSN和某些其他ID的other_ids列外,還有一個id_number列。

面前的桌子被分成addressphone表,我有這個腳本: (寫在Sybase)

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'); 

現在我們移動到Oracle 11g,地址和電話信息被分割。

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

我必須先在地址表和電話表之間進行INNER JOIN,然後做兩個OUTPUT JOIN到both_ids嗎?

我嘗試以下,並沒有奏效:

Insert Into.. 
    select ... 
    FROM a1. address 
     INNER JOIN t.Phone ON a1.id_number = t.id_number 
     LEFT OUTER JOIN both_ids a ON a.id_number = a1.id_number 
    WHERE a1.adrr_type_code = 'H' 
+0

您是否期望給定的id_number始終出現在所有三個表中,其中兩個還是僅有一個? – Rikalous

+0

給定的id_number應始終存在於地址和電話表中。如果給定的id_number存在於地址中,則它應該也出現在電話表中,除非該實體沒有電話。在Both_ids表另一方面這個給定的id_number可能會或可能不存在 – user1557856

+0

好吧,你的加入看起來不錯,那麼什麼是行不通的?錯誤或錯誤的結果? – Rikalous

回答

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,它會工作。另外,用左外連接替換右外連接,因爲這就是你想要實現的(同樣,根據你寫的註釋)。

+0

我認爲在哪裏a.id_number = a1.id_number(+)表示一個外部左連接。我錯了嗎? http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/11971;pt=13175 – user1557856

+0

@ user1557856其右外連接。 – Annjawn

+0

是不是'= *'在Sybase中對右外連接的操作符? –