Oracle SQL - 加入3个表而不复制数据

时间:2015-07-28 02:14:42

标签: sql oracle join

我正在开发人物搜索。因此,使用人名,我首先搜索他们是否存在于人员表中,然后是否有任何相关的组织或注册。

我有3张桌子:

PER - (Person)  
ORG - (Organisation)  
REG - (Register Entry)

PER是关键表,因为我想找到与特定人相关的所有相关ORG和REG,ORG和REG之间也存在关系,因为ORG通常会(并非总是如此) )有一个相关的REG

我目前正在加入

PER > ORG (Left join) as PER_ORG
PER > REG (Left join) as PER_REG
Then joining PER_ORG > PER_REG (FULL OUTER JOIN)

输出应该看起来像

PER_NAME        ORG_DETAIL          REG_DETAIL
STUART ADAMS    ADAMS PARTNERSHIP   ADAMS BUSINESS 

这确实通过将ORG与REG匹配来返回正确的结果,但是当PER存在于PER中并且在ORG或REG中只有一个相关记录时,我得到Person的重复结果。

PER_NAME        ORG_DETAIL      REG_DETAIL
STUART ADAMS    NULL            ADAMS BUSINESS
STUART ADAMS    NULL            NULL

我理解为什么我得到了我的结果,但是当我只有一个相关的ORG或REG存在时,我无法弄清楚如何消除重复的Person结果。

简单地说查询看起来像

SELECT * 
FROM(
    (SELECT *
    FROM
    PER LEFT JOIN ORG ON PER.PER_ID = ORG.PER_ID
    ) PER_ORG

    FULL OUTER JOIN

    (SELECT *
    FROM
    PER LEFT JOIN REG ON PER.PER_ID = REG.PER_ID
    ) PER_REG

    ON PER_ORG.LINK_ID = PER_REG.LINK_ID
)

1 个答案:

答案 0 :(得分:1)

也许我错过了一些至关重要的内容,但是这个查询是否有任何原因无法运作:

SELECT PER.PER_NAME, ORG.ORG_DETAIL, REG.REG_DETAIL
FROM PER 
LEFT JOIN ORG ON PER.PER_ID = ORG.PER_ID
LEFT JOIN REG ON PER.PER_ID = REG.PER_ID 
           AND ORG.LINK_ID = REG.LINK_ID 
            OR ORG.LINK_ID IS NULL;

如果没有,您可以通过名称将max应用于外部查询和组中的per_detail和org_detail列来解决您的问题,如下所示:

SELECT 
    COALESCE(PER_ORG.PER_NAME, PER_REG.PER_NAME) PER_NAME
    , MAX(ORG_DETAIL) ORG_DETAIL
    , MAX(REG_DETAIL) REG_DETAIL
FROM (
-- removed the rest to save some space...
)
GROUP BY COALESCE(PER_ORG.PER_NAME, PER_REG.PER_NAME)