2011-11-14 160 views
0

所以我有三個表我想從以下查詢提取數據:使用多個左外連接PL/SQL

select tats.machine_interval_id as machine_interval_id, 
     tats.interval_type as interval_type, 
     tats.interval_category as interval_category, 
     ops.opstatemnemonic as operational_state, 
     nptc.categorytype as idle_category, 
     tats.interval_duration as interval_duration 
from temp_agg_time_summary tats 
left outer join operationalstates ops on ops.opstateid=tats.operationalstatenumeric 
left outer join nptcategories nptc on nptc.categoryid=tats.categorytypenumeric 

我遇到的問題是,每當有一個值,不是nptcategories表中的空值,它將記錄加倍,然後輪流拋出我後來在我的包中進行的任何計算。我相信這個問題與查詢中有多個左外連接有關。我的問題可能看起來相當簡單,但我是PL/SQL的新手,請耐心等待。

我想知道的是,如何在查詢中使用多個左外部聯接而無此問題?什麼是更好的方式來構建這個查詢?

更新

好了,所以我找到了問題的代碼行是如下:

left outer join nptcategories nptc on nptc.categoryid=tats.categorytypenumeric 

而且使用不同的時候,它會刪除所有的重複記錄,但會使用這會引起其他我不知道的問題?我是否應該更側重於弄清楚爲什麼上面的連接不能正常工作,或者是否足夠明顯?

+1

具有多個外連接不應影響結果集中的行數。返回額外的行是由於不正確的連接('ON'語句,缺少某些條件),或者在WHERE子句中沒有正確的謂詞。 – Wolf

+0

@Wolf使用明確擺脫重複記錄。但是,這會被認爲是一個適當的修復?或者我應該更多地瞭解爲什麼重複記錄是在第一個地方創建的? – James213

+1

那麼,對於同一'categoryid',是否有多個'categorytypes'?因爲這是我能看到'DISTINCT'解決你的問題的唯一方法......如果有多個'categorytypes'返回相同的''tats'「記錄,那麼這些結果仍然會被複制...... –

回答

0

好了,所以服用狼的建議後,我去了,跑的代碼

select categorytype, count(*) 
from nptcategories 
group by categorytype 
having count(*) > 1; 

以下行運行在此之後,我發現,不知何故有此表是記錄重複的話,這是固定的通過刪除重複項並設置表具有唯一的ID。這是通過在DB上使用以下腳本完成的:

alter table nptcategories add constraint nptcatidunq unique(categoryid)