2016-04-30 2 views
0

У меня есть запрос:Скрыть дублирует строки SQL

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; 

Но у меня есть дублирует строку, если один срока есть еще один tga.GRP_ID. Как я могу скрыть это? Благодаря! Result screen

+0

Прежде чем кто-нибудь сможет ответить, как вы должны скрыть видимый дубликат, вы должны указать приемлемые критерии для скрытия дубликатов. Например, последний столбец в вашем запросе - это GRP_ID ... в случае, когда вы указали (где TRM_ID равно 16), у вас есть два разных значения GRP_ID (6 и 2). Если вы хотите удалить дубликаты, какой из этих дубликатов должен быть скрыт? Строка с идентификатором группы 6 или идентификатором группы 2? – nb1987

+0

@ nb1987 Нет разницы. Можно скрыть любые строки, которые были – NickDevil

ответ

0

Есть два способа спрятаться. Если не имеет значения, какое значение GRP_ID скрыто, то, возможно, вам не нужно включать столбец GRP_ID. В этом случае можно удалить столбец 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; 

У меня нет базы данных с вашей схемой для тестирования, но я считаю, что запрос должен работать. Это довольно распространенный шаблон в Oracle, когда вам нужно удалить дубликаты, где SELECT DISTINCT не будет работать. Вы можете видеть, что ваш запрос должен быть встроен в качестве подзапроса; то внешний запрос выбирает, где ROWNUM равен 1. Ключ состоит в том, что он разбивается на столбец TRM_ID - в основном, вы PARTITION BY, какие столбцы вы хотите быть уникальными в своем конечном выпуске.

(Если вы не хотите, чтобы ROWNUM в конечной продукции, то вместо SELECT, д. * Вы можете выбрать каждый столбец, который вы хотите отдельно из подзапроса.)

0

Альтернативой подхода nb1987, используя ROW_NUMBER будет использовать GROUP BY во всех выходных столбцах, кроме того, что вызывает нежелательные дубликаты (GRP_ID). В SELECT вы можете использовать MIN/MAX с GRP_ID, если вам действительно нужен столбец, но не волнует, какая строка выбрана (почему ?!).

Это может быть лучше или хуже, чем решение nb1987, поэтому было бы целесообразно попробовать его с вашими данными, чтобы быть уверенным.

Смежные вопросы