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,但这需要很长时间(请参阅我以前的帖子)。

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

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

但这也需要很长时间(仅 FATHER_USER_NAME 和 MOTHER_USER_NAME 需要 22 秒)。

谁能建议为我需要的视图编写查询的最有效方法?我不知道如何使它快速。

仅供参考:使用 Oracle 10g。

4

2 回答 2

0

在 UPPER(USER_NAME) 和 UPPER(FATHER_USER_NAME)、UPPER(ft.MOTHER_USER_NAME) 上添加基于函数的索引 ...

这应该可以解决您的问题。

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

于 2012-10-23T16:50:43.933 回答
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) || '%');
于 2012-10-23T16:58:13.267 回答