SQL查询:将单个属性(列)值更新为k个不同的值

时间:2015-07-22 12:55:25

标签: mysql sql sql-update

我想用 k 替换属性值不同的值(我从列表中获取,因此 k 可以根据列表的大小而改变)。此外, k 不同的值需要以相同的比例更新。

e.g。属性Education的值为University

现在,我想要更新University应替换为BachelorsMastersDoctorate的表格。

如果有100个元组,Education = University那么:
33应更新为Bachelors
33到Masters
34到Doctorate

注意:在给定的示例中 k = 3.我需要一个可用于 k 的不同值的查询。因为,我将使用python将此查询集成到mysql中,您可以编写任何变量来表示 k 和列表索引。

编辑:一种天真的方法是首先将count个元组存储在Education = University的位置。然后将该计数除以 k (其中 k 是列表的长度)并在for循环中重复运行更新查询,直到列表中的值耗尽为止。
在更新查询中,我通过设置limit = count / k 来限制受影响的行数。有没有更有效的方法来实现同样的目标?

1 个答案:

答案 0 :(得分:0)

对于不同的环境,存在大量不同的解决方案。 我向您展示了如何通过单个更新来解决它。它不是最佳的,但它的工作正常。假设我们有两个表 - 学生(id,教育)和教育(姓名)。 那么,你在这里:

update student
    set education_new = (
        select
            --s2.id, s2.education,
            e1.name
        from (
                select (select count(*) from education x where x.rowid <= e.rowid) id, name  from education e
            ) e1,
            (
                select
                    s.id, (select count(*) from student x where x.education = 'University' and x.rowid <= s.rowid) % (select count(*) from education) + 1 as e_id
                from student s
            ) s2
        where
            e1.id = s2.e_id
            and s2.id = student.id
        )
where education = 'University'

在这种情况下,您还需要运行额外更新:

update student
    set education = education_new
where
    education <> education_new
    and education_new is not null