我有疑问:
SELECT TermMsg.TRM_ID,
upper(TermMsg.TRM_LOCALE_CODE) as TRM_LOCALE_CODE,
TermMsg.TRM_NAME,
TermMsg.TRM_DESCRIPTION,
upper(substr(TRM_NAME,1,1)) AS LETTER,
(Term.TRM_PUBLISHED) AS PUBLISHED,
tga.GRP_ID
FROM EPBS_DATA.GLS_TERM_LOC TermMsg, EPBS_DATA.GLS_TERM Term left join
EPBS_DATA.GLS_TERM_GROUP_ASSIGNMENT tga
on Term.TRM_ID = tga.TRM_ID
WHERE TermMsg.TRM_ID = Term.TRM_ID and TermMsg.TRM_NAME IS NOT NULL
ORDER BY TRM_NAME;
答案 0 :(得分:0)
有两种方法可以隐藏。如果隐藏GRP_ID值无关紧要,那么您可能不需要包含任何GRP_ID列。在这种情况下,您可以从SELECT子句中删除GRP_ID列并执行SELECT DISTINCT:
SELECT DISTINCT TermMsg.TRM_ID,
upper(TermMsg.TRM_LOCALE_CODE) as TRM_LOCALE_CODE,
TermMsg.TRM_NAME,
TermMsg.TRM_DESCRIPTION,
upper(substr(TRM_NAME,1,1)) AS LETTER,
(Term.TRM_PUBLISHED) AS PUBLISHED
FROM EPBS_DATA.GLS_TERM_LOC TermMsg, EPBS_DATA.GLS_TERM Term left join
EPBS_DATA.GLS_TERM_GROUP_ASSIGNMENT tga
on Term.TRM_ID = tga.TRM_ID
WHERE TermMsg.TRM_ID = Term.TRM_ID and TermMsg.TRM_NAME IS NOT NULL
ORDER BY TRM_NAME;
但是,如果您确实需要包含至少一些GRP_ID值,那么您可以使用ROW_NUMBER() function:
SELECT q.*
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY TermMsg.TRM_ID ORDER BY tga.GRP_ID) AS ROWNUM, TermMsg.TRM_ID,
upper(TermMsg.TRM_LOCALE_CODE) as TRM_LOCALE_CODE,
TermMsg.TRM_NAME,
TermMsg.TRM_DESCRIPTION,
upper(substr(TRM_NAME,1,1)) AS LETTER,
(Term.TRM_PUBLISHED) AS PUBLISHED,
tga.GRP_ID
FROM EPBS_DATA.GLS_TERM_LOC TermMsg, EPBS_DATA.GLS_TERM Term left join
EPBS_DATA.GLS_TERM_GROUP_ASSIGNMENT tga
on Term.TRM_ID = tga.TRM_ID
WHERE TermMsg.TRM_ID = Term.TRM_ID and TermMsg.TRM_NAME IS NOT NULL
) q
WHERE q.ROWNUM = 1
ORDER BY q.TRM_NAME;
我没有要测试您的架构的数据库,但我相信查询应该有效。当您需要删除SELECT DISTINCT不起作用的重复项时,这是Oracle中相当常见的模式。您可以看到您的查询需要作为子查询嵌入;然后,外部查询选择ROWNUM等于1的位置。关键是它被TRM_ID列分区 - 基本上,您要在最终输出中选择要唯一的列的PARTITION BY。
(如果您不想在最终输出中使用ROWNUM,那么您可以从子查询中单独选择每个列而不是SELECT q。*。
答案 1 :(得分:0)
使用ROW_NUMBER的nb1987方法的替代方法是在所有输出列上使用GROUP BY,除了导致您不需要的重复项(GRP_ID)的列。在SELECT中,如果你真的想要列,可以使用带有GRP_ID的MIN / MAX,但不要关心选择哪一行(为什么?!)。
这可能比nb1987的解决方案表现更好或更差,因此有必要尝试使用您的数据来确定。