Oracle SQL是否将字段的值更改为列表中的其他值,只要新值与当前值不同?

Oracle SQL是否将字段的值更改为列表中的其他值,只要新值与当前值不同?,sql,oracle10g,Sql,Oracle10g,我有一个测试表,其中包含Oracle 10g XE中的33条员工记录。示例如下(我只展示了5个): 我不是SQL人员,所以我只知道基本的插入、更新等。我想要实现的是将每个员工的部门从另一个员工更改为另一个部门,只要它与他们当前的部门不同。基本上我想的是: 从每个员工(部门A、部门B、部门B、部门C、部门A)获取所有部门,是否将其存储在变量中 对于每个员工,将以前收集的部门列表中的不同部门放入其记录中。新部门不得与以前的记录相同 上述示例的结果如下所示 就记录而言,不仅仅是A-C部门。我的33

我有一个测试表,其中包含Oracle 10g XE中的33条员工记录。示例如下(我只展示了5个):

我不是SQL人员,所以我只知道基本的插入、更新等。我想要实现的是将每个员工的部门从另一个员工更改为另一个部门,只要它与他们当前的部门不同。基本上我想的是:

  • 从每个员工(部门A、部门B、部门B、部门C、部门A)获取所有部门,是否将其存储在变量中
  • 对于每个员工,将以前收集的部门列表中的不同部门放入其记录中。新部门不得与以前的记录相同
  • 上述示例的结果如下所示

  • 就记录而言,不仅仅是A-C部门。我的33名员工记录大多都有唯一的部门。只有2-3个部门拥有超过1名员工。因此,我可以保证,可能不会有任何情况下,员工记录无法分配到与当前部门不同的部门。

    这是一个比您可能意识到的更困难的问题。首先,这是一个排列问题,因为您希望部门的最终计数相同。其次,有时它是无法解决的(比如,如果超过一半的员工在同一个部门)

    如果要为员工调整部门,请使用以下方法:

    with cte as (
          select e.*,
                 row_number() over (order by emp_id) as orig_seqnum,
                 row_number() over (order by dbms_random.value) as new_seqnum
          from employees e
         )
    select e1.*, e2.dept as new_dept
    from cte e1 join
         cte e2
         on e1.orig_seqnum = e2.new_seqnum;
    

    这并不能保证新部门与旧部门不同。事实上,有很多方法可以做到这一点。但是,鉴于您的大多数部门只有一名员工,这可能会解决您的问题。

    一半以上的员工都在同一个部门,您说得对,但这并不影响我的情况。无论如何,当我运行上述程序时,我得到ORA-00904:“E”:无效标识符。什么是cte?是表名还是什么?新部门怎么样?我是否需要在我的表中创建一个新部门字段?最后是e1.seqnm。以前的代码中没有seqnm。只有原始序列号和新序列号。对于n00bish问题,我很抱歉,但我真的不知道在哪里查找错误。CTE是带有表达式的
    。我修复了语法错误。这是一个
    select
    查询。如果您需要更新,可以将其转换为更新或合并。谢谢。在我将e1.seqnum更改为e1.orig_seqnum之后,它与上面编辑的代码一起工作。我会想到自己的更新部分。顺便说一句,有时候新部门和旧部门是一样的。我想最好使用正确的应用程序代码而不是SQL来解决这个问题。无论如何,你的解决方案现在已经足够了。我将不得不把我的案例改为“不是每个员工都换部门”,因为在现实情况中,情况就是这样。