2016-11-22 19 views
0

Я пытаюсь извлечь только уникальные записи из таблицы, но я думаю, что что-то не так с моим запросом.Как игнорировать дубликаты записей в sybase?

select distinct RIID, duplicateInfo from duplicateRecords where RIID > 3920011 

Когда я исполняю выше запроса я получаю этот результат

RIID | duplicateInfo 
___________________________________ 
3920011 Repeated:12009:CLEAR 
3920011 Repeated:12012:CLEAR 
4233901 Repeated:18129:HIT 
4820129 Repeated:22901:PENDING 
4820129 Repeated:22983:PENDING 

И я хочу, чтобы результат ниже

RIID | duplicateInfo 
___________________________________  
3920011 Repeated:12012:CLEAR 
4233901 Repeated:18129:HIT 
4820129 Repeated:22983:PENDING 

Пожалуйста, любая помощь будет высоко оценена.

Благодаря

+0

потому что duplicateInfo не отличается – McNets

+0

Любое предложение, как бы я выполнил свою задачу? –

ответ

1
select distinct RRID, 
    (select duplicateInfo 
    from duplicateRecords m 
    where m.RIID = duplicateRecords.RRID 
    having cast(substring(duplicateInfoNumber,10,6) as int) = min(cast(substring(duplicateInfoNumber,10,6) as int))) 
from duplicateRecords 
where RRID > 3920011 
+0

Не работает, отображая тот же результат. –

+0

Да, позвольте мне изменить, вы хотите по убыванию, отсортированный по duplicateInfo. – McNets

+0

Я также попробовал desc-order. Но, похоже, не повезло. –

0

не имеют SyBase, чтобы проверить это с. Вот пример из mysql, чтобы дать вам несколько указателей.

DROP TABLE IF EXISTS `duplicaterecords`; 

CREATE TABLE `duplicaterecords` (
    `RRID` int(11) DEFAULT NULL, 
    `duplicateInfo` varchar(200) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `duplicaterecords` (`RRID`, `duplicateInfo`) 
VALUES 
    (3920011,'Repeated:12009:CLEAR'), 
    (3920011,'Repeated:12012:CLEAR'), 
    (4233901,'Repeated:18129:HIT'), 
    (4820129,'Repeated:22901:PENDING'), 
    (4820129,'Repeated:22983:PENDING'), 
    (4233901,'Duplicate:5555555:CLEAR'); 

    select grouped.* 
, base.duplicateInfo 
from 
( 
    select grouped.RRID, max(grouped.duplicateInfoId) duplicateInfoId 
    from (
     select RRID 
     , cast(substring_index(substring_index(duplicateInfo,':',2),':',-1) as unsigned) duplicateInfoId 
     , duplicateInfo 
     from duplicateRecords 
    ) grouped 
    group by grouped.RRID 
) grouped 
inner join (
    select RRID 
    , cast(substring_index(substring_index(duplicateInfo,':',2),':',-1) as unsigned) duplicateInfoId 
    , duplicateInfo 
    from duplicateRecords 
) base 
on grouped.duplicateInfoId = base.duplicateInfoId ; 

-- example results 

RRID duplicateInfoId duplicateInfo 
3920011 12012 Repeated:12012:CLEAR 
4233901 5555555 Duplicate:5555555:CLEAR 
4820129 22983 Repeated:22983:PENDING 
0

Существует более простой и эффективный способ - но только если вы работаете на Sybase ASE (не работает для Sybase IQ или Sybase SQL Anywhere). Во-первых, это проблема с «дублирующимся ключом», а не проблема с «дублирующейся строкой». Трюк ниже удалит все строки с дублирующимися ключами. Но обратите внимание, что не определено, какую строку выбрать в случае дубликатов ключей, поэтому первая сохраняется, а остальные отбрасываются. Таким образом, вы должны применить некоторое упорядочение в запросе SELECT, для того, чтобы реализовать другой выбор критериум

CREATE TABLE uniquetab (RRID ..., duplicateInfo ...) пойти CREATE UNIQUE INDEX IX на uniquetab (RRID) С IGNORE_DUP_KEY перейти

ВСТАВИТЬ uniquetab SELECT * FROM duplicateRecords ORDER BY перейти

альтернативный способ заключается в ППГ-из таблицы duplicateRecords, а затем BCP его в uniquetab таблице.