2010-06-08 77 views
1

我將關係數據庫轉換爲Oracle中的對象關係。如何將全外連接查詢轉換爲O-R查詢?

我有一個查詢,使用舊的全外連接。

是否可以在不明確使用完整外連接的情況下爲O-R數據庫編寫相同的查詢?

對於正常的內部連接很簡單,我只是使用點符號和ref/deref一起。

我很感興趣,這在一般的所以我們說關係查詢是:

select a.attr, b.attr from a full outer join b on (a.fk = b.pk); 

我想知道這是否是一個好主意,做這種方式:

select a.attr, b.attr from a_obj a full outer join b_obj b on (a.b_ref = ref(b)); 
+0

你能否提供原始查詢?是否完全外部聯接沒有提供正確的結果,或者您是否由於某種原因想要避免完全外部聯接? – Thomas 2010-06-08 03:08:34

+0

外部連接是好的,我只是不確定它是否是在O-R數據庫中推薦的。正常連接可以避免。 – Kugel 2010-06-08 03:13:15

回答

3

說我有實體的「銷售歷史」和「銷售預測」。對於給定的產品和期限,我想看到實際銷售與預測銷售。但是任何給定的時間段可能沒有預測或實際銷售,所以我使用一個SQL像:

SELECT NVL(f.product_id, h.product_id), NVL(f.period, h.period), 
     f.forecast_sale, h.actual_sale 
FROM forecast f 
FULL OUTER JOIN history h ON h.product_id = f.product_id and h.period = f.period 

基本上我在一個共同的關鍵連接兩個子表在一起。完全外連接在關係數據庫中很少見,因爲規範化通常會將實體與公用鍵合併。左邊和右邊的外部連接比較常見,因爲典型的用例是即使父母沒有孩子也需要一行來選擇父母及其子女。

所以如果你有一個完整的外連接,首先要檢查的是數據結構是否正確。

對象模型中的數據結構是固定的或「預加入」的。如果模型中的數據結構不容易支持某個結果集的生成,那麼您幾乎不得不離開(或者至少編寫了很多功能來手動提取和加入數據)。

如果您發佈了一些關於相關數據結構的細節,建議可能會更精確。

+0

+1,很好的例證概念。 – DCookie 2010-06-08 14:31:27

+0

換句話說,你想用重組數據庫來解決我的問題。這是一個有效的方法。我不是SQL專家,如果有一種通用的方法用ref/deref語法替換完整的外連接,我更感興趣。 – Kugel 2010-06-08 16:06:00