Sql 使用多个Or语句最大化数据库视图

Sql 使用多个Or语句最大化数据库视图,sql,join,view,oracle10g,Sql,Join,View,Oracle10g,我试图编写一个数据库视图,从两个表中进行选择。以下是一个例子: 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进行关联) 我需要创建一个视图,列出每个用户,以及他们所属的家庭的名称。我尝试过很

我试图编写一个数据库视图,从两个表中进行选择。以下是一个例子:

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进行关联)

我需要创建一个视图,列出每个用户,以及他们所属的家庭的名称。我尝试过很多事情,但每一件都失败了

我第一次尝试从
FAMILY\u表中联合
选择
语句,但这花费了很长时间(请参阅)

然后我试着做一个“或加入”:

但这也需要很长的时间(仅父亲和母亲的用户名就需要22秒)

有人能为我需要的视图提供最有效的查询方式吗?我不知道怎样才能快点


仅供参考:使用Oracle 10g。

根据UPPER(用户名)和UPPER(父用户名)、UPPER(母用户名)添加基于函数的索引

这应该能解决你的问题


你能粘贴你的执行计划吗?

这显然效果很快(大约500毫秒):


你的查询应该可以用。。。?它之所以慢,是因为上面可能没有索引(USER_NAME)?能否有第三个表将多个用户链接到多个家庭(多对多)?@lc。对不起,打字错误。我修好了。我正在考虑我尝试过的另一种方法,我希望它尽可能简单。添加另一个表需要更新代码以使新表保持最新,或者编写触发器以使其保持最新。我宁愿避免这样。
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)
)
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) || '%');