0

我有一个表,其中的值不应该相同。由于糟糕的实现软件不会检查以确保用户是否输入了重复项,因此我被委托编写一个“简单”的 sql 语句或函数来查看列中的所有值并确保它们不是完全相同的。sql 本身将每月执行一次,因此它不必高效。

该列存储 int ,我想增加一个重复值,并且每次都继续这样做,直到表中没有更多条目具有该列的相同值。有什么建议我应该怎么做?我不知道从哪里开始。

感谢任何人的洞察力。

编辑:抱歉忘了提到数据中不重复的值应该保持不变。这些是用于客户的设置,只有当它们具有重复值时我们才应该惩罚它们。如果他们不这样做,那么我们不应该破坏他们的设置,否则他们会生气。

它只是一张表,包含很多列,但这一特定列特别是 int 类型并且从不包含任何空值,不应该有任何重复。

4

3 回答 3

1

要了解问题的大小,请尝试以下内容,它是 Oracle 语法,因为我不知道 mysql,但应该有一个等价物。

SELECT your_col, COUNT(your_col)
  FROM your_table
 GROUP BY your_col

我真的不认为当你发现一个重复值时增加一个值是要走的路,你可能会在解决第一个重复值时创建另一个重复值,有效地在每个增量之后你必须从头开始再次检查。正确的方法是对用于输入数据的任何内容添加验证以拒绝任何重复项。那么至少你只需要清理一次数据。

抱歉,如果这不是您所希望的:-)

ETA 你的公司错了,每周运行一次 sql 不会便宜,至少从长远来看是这样。你在需要缝合的东西上打石膏。现在接受打击并解决根本问题要好得多,首先,一个不想要任何重复的列,但无论如何都允许输入它们?有一个主要的 WTF 开始。

于 2012-06-27T14:20:32.920 回答
1
 create table tableName (KeyCol int identity(1,1), intCol int)
 insert into tableName values (1), (2), (2), (3), (5), (6), (5), (7), (9)


While exists (
    select intCol
    from tableName
    group by intCol
    having count(*) > 1
)
begin

    declare @newValue int

    select @newValue = min(t1.intCol) + 1
    from tableName t1
    left join tableName t2
    on t1.intCol + 1 = t2.intCol
    where t2.intCol is null

    update tx
    set intCol = @newValue
    from tableName tx
    where intCol = 
    (select top 1 intCol
    from tableName t1
    group by intCol
    having count(*) > 1
    order by intCol)
    and KeyCol = (select min(KeyCol) from tableName t2 where t2.intCol = tx.intCol)
end

select * from tableName order by 2
于 2012-06-27T14:22:07.827 回答
0

为什么不删除此列并使用唯一数据重新创建或重新填充它并在其上放置 UNIQUE INDEX?

于 2012-06-27T14:10:32.323 回答