【问题标题】:Swapping two rows of the same table based on ROWID in OracleOracle中根据ROWID交换同一张表的两行
【发布时间】:2013-11-06 22:30:26
【问题描述】:

我有一张桌子 duty_rota。其中有以下示例数据集。

Rowid  duty_date   duty_type  duty_officer

   AA1    01-JAN-00    1             48
   AA2    02-JAN-00    3              5

现在我可以在这里检索 Rowid 和交换日期。在我的 where 条件下应该有 rowid。

Rowid  duty_date   duty_type  duty_officer

       AA1    02-JAN-00    1             48
       AA2    01-JAN-00    3              5

有人可以帮我吗,我如何通过oracle中的SQL查询来实现。

【问题讨论】:

  • 你想达到什么目的?为什么要关心行的rowid
  • 你说的rowid是指oracle的伪列rowid
  • 是的,Rowid(伪列)就是我的意思,我刚刚编辑了我的问题。请看一看。
  • 但是为什么要依赖 rowid 呢?你没有主键吗?你不能使用其他更有意义的列吗?为什么它必须保持相同的 rowid ?
  • 这个数据库设计不当,没有主键,我必须在我的应用程序中进一步使用rowid..这就是原因!!

标签: sql oracle logic


【解决方案1】:

您可以使用 merge 语句在一个 sql 命令中交换两行之间的值:

merge into duty_rota d
using (select * from duty_rota ) s
on ((d.rowid = 'AA1' and s.rowid = 'AA2') or (d.rowid = 'AA2' and s.rowid = 'AA1'))
when matched then update set d.duty_date = s.duty_date 

【讨论】:

    【解决方案2】:
    DECLARE @temp_date DATE
    
    SET @temp_date = NULL
    
    SELECT duty_date FROM duty_rota WHERE ROWID = 'AA1' INTO @temp_date
    
    UPDATE duty_rota 
    SET duty_date = (SELECT duty_date FROM duty_rota WHERE ROWID = 'AA2')
    WHERE ROWID = 'AA1'
    
    UPDATE duty_rota 
    SET duty_date = @temp_date
    WHERE ROWID = 'AA2'
    

    或者类似的东西,虽然我更熟悉 MySQL 和 SQL Server。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多