【问题标题】:How to ignore duplicate records in sybase?如何忽略sybase中的重复记录?
【发布时间】:2016-11-24 21:59:00
【问题描述】:

我正在尝试仅从表中检索唯一记录,但我猜我的查询有问题。

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 因为 duplicateInfo 不明确
  • 任何建议,我将如何完成我的任务?

标签: distinct sap-ase select-query


【解决方案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

【讨论】:

  • 是的,让我修改一下,你想要按 duplicateInfo 降序排列。
  • 我也尝试了 desc 命令。但这似乎并不走运。
  • 对于相同的结果,您应该使用 where RRID >= 3920011
  • 其实它是一个不同版本的 sybase,即使我不能在子查询中使用 order by 子句。
【解决方案2】:

我没有 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

【讨论】:

    【解决方案3】:

    有一种更简单、更有效的方法——但前提是您在 Sybase ASE 上运行(不适用于 Sybase IQ 或 Sybase SQL Anywhere)。 首先,这是一个“重复键”问题,而不是“重复行”问题。 下面的技巧将删除所有具有重复键的行。但请注意,没有定义在重复键的情况下选择哪一行 - 所以保留第一个,其余的被丢弃。因此,您应该在 SELECT 查询中应用一些排序,以实现不同的选择标准

    CREATE TABLE uniquetab (RRID ..., duplicateInfo ...) 去 使用 IGNORE_DUP_KEY 在 uniquetab(RRID) 上创建唯一索引 ix 去

    插入唯一标签 SELECT * FROM duplicateRecords ORDER BY 去

    另一种方法是 BCP 输出 duplicateRecords 表,然后将其 BCP 到 uniquetab 表中。

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2019-10-17
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多