2012-10-23 21 views
0

我想寫一個數據庫視圖,從2個表中選擇。這裏有一個例子:使用多個或語句最大化數據庫視圖

USER_TABLE 
- ID 
- USER_NAME 

FAMILY_TABLE 
- ID 
- FAMILY_NAME 
- FATHER_USER_NAME 
- MOTHER_USER_NAME 
- GRANDFATHER_1_USER_NAME 
... (multiple user name columns) 

(表作家沒有通過ID相關聯出於某種原因)

我基本上需要做已每個用戶所列觀點,與家人的名字一起他們屬於。我嘗試了很多東西,但每個都似乎失敗了。

我第一次試圖聯合SELECT來自FAMILY_TABLE的陳述,但這永遠持續下去(見my previous post)。

然後我試圖做一個「或加入」:

SELECT ut.USER_NAME, ft.FAMILY_NAME 
FROM USER_TABLE ut 
LEFT OUTER JOIN FAMILY_TABLE ft ON 
(
    UPPER(ut.USER_NAME) = UPPER(ft.FATHER_USER_NAME) 
    OR 
    UPPER(ut.USER_NAME) = UPPER(ft.MOTHER_USER_NAME) 
    ... (etc) 
) 

但也需要較長的時間(花了22秒,只是FATHER_USER_NAME和MOTHER_USER_NAME)。

任何人都可以建議最有效的方式來編寫我需要的視圖的查詢?我不知道如何讓它快速。

僅供參考:使用Oracle 10g。在UPPER(USER_NAME)和UPPER(FATHER_USER_NAME),UPPER(ft.MOTHER_USER_NAME)

+0

該查詢你應該工作...?它很慢的原因是UPPER(USER_NAME)上可能沒有索引? –

+0

您是否可以有第三張表格將多個用戶分別鏈接到多個家庭(多對多)? – amphibient

+0

@lc。對不起,錯字。我修好了它。我正在考慮我嘗試過的另一種方法。 –

回答

0

這顯然是工作迅速(約500毫秒):

SELECT ut.USER_NAME, familyInfo.FAMILY_NAME 
FROM USER_TABLE ut 
LEFT OUTER JOIN 
(
    SELECT 
    (
     UPPER(ft.FATHER_USER_NAME) || ',' || 
     UPPER(ft.MOTHER_USER_NAME) || ',' || 
     ... (etc) 
    ) AS MEMBERS, 
    ft.* 
    FROM FAMILY_TABLE ft 
) familtyInfo 
ON familyInfo.MEMBERS LIKE ('%' || UPPER(ut.USER_NAME) || '%'); 
0

基於函數的添加索引...

這應該解決您的問題。

你可以粘貼你的執行計劃嗎?

相關問題