隐藏重复行SQL

时间:2016-04-30 05:51:55

标签: sql oracle

我有疑问:

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;

但如果一个Term有一个tga.GRP_ID,我有重复的行。我怎么能隐藏它?谢谢! Result screen

2 个答案:

答案 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的解决方案表现更好或更差,因此有必要尝试使用您的数据来确定。