我正在开发人物搜索。因此,使用人名,我首先搜索他们是否存在于人员表中,然后是否有任何相关的组织或注册。
我有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
)
答案 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)