oracle相邻表记录交换(单双两两交换)

在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换)。

另外,如果最后的单独行没有对应的下一行匹配记录的话,就不更新最后的单独行记录。

觉得有点意思,就试着实现一下(Oracle),并记录下来。

创建一个diosos表。

-- 如果表存在,就删除表(方便测试)
drop table diosos;
-- 创建表
create table diosos(id int, name varchar(64));

往表中插入数据。

-- 插入数据
insert into diosos(id, name) values(1, ‘one‘);
insert into diosos(id, name) values(2, ‘two‘);
insert into diosos(id, name) values(3, ‘three‘);
insert into diosos(id, name) values(4, ‘four‘);
insert into diosos(id, name) values(5, ‘five‘);
insert into diosos(id, name) values(6, ‘six‘);
insert into diosos(id, name) values(7, ‘seven‘);
insert into diosos(id, name) values(8, ‘eight‘);
insert into diosos(id, name) values(9, ‘nine‘);

查询出来看看数据是不是对的先。

-- 查询数据
select * from diosos;

实现相邻表记录交换(单双两两交换),原理就是根据对id取余判断奇偶和相邻id加减做连接关联,更新行记录的name。

-- 更新,两两交换,不成对不交换
update diosos d1
set d1.name = (
    select d2.name
    from diosos d2
    where (mod(d1.id, 2) = 0 and d1.id = (d2.id + 1))
        or (mod(d1.id, 2) = 1 and d1.id = (d2.id - 1))
)
where exists(select d3.id from diosos d3 where d3.id = (d1.id + 1));

再次查询,成功实现。

-- 再次查询
select * from diosos;

还是挺好玩的,虽然我觉得几乎不会有实际场景,哈哈哈。

"每一个结局都是自己亲手裁缝的。"

原文地址:https://www.cnblogs.com/yanggb/p/11331695.html

时间: 2024-07-30 04:55:35

oracle相邻表记录交换(单双两两交换)的相关文章

sql server相邻表记录交换(单双两两交换)

在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就不更新最后的单独行记录. 觉得有点意思,就试着实现一下(SQL Server),并记录下来. 创建一个diosos表. -- 如果表存在,就删除表 if object_id(N'diosos', N'U') is not null drop table diosos; -- 创建表 create t

java 操作oracle 建表,更新记录

1.  建立表的类 import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; public class lx01{ public static void main(String[] args) throws SQLException, ClassNotFoundE

数据库:MySQL(单表的表记录的操作)(二)

一.表记录的增删改查 1.增加表记录 <1>插入一条记录: insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); 示例: insert into employee_new (id,name,birthday,salary) values (1,'yuan','1990-09-09',9000); insert into employee_new values (2,'alex','1989-

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Laravel用post提交表单常见的两个错误

最近在自学Laravel,测试用post方法提交表单时碰到两个错误: 1.获取传入的值时,报错如下图所示: 在stackFlow找答案时各种解释都有,但认真读一下报错信息,意思大概是:获取Http传入值方式不允许,检查代码,将偷懒写的: 1 Route::get('test',function(){ 2 // 3 }); 改为用post方法或者any方法接收即可: 1 Route::post('test',function(){ 2 // 3 }); 2.提交表单时,第二个报错信息如下图所示:

ORACLE恢复删除表或表记录

一:表的恢复对误删的表,只要没有使用PURGE永久删除选项,那么从FLASHBACK TABLE区恢复回来希望是挺大的.一般步骤有:1.从FLASHBACK TABLE里查询被删除的表 SELECT * FROM RECYCLEBIN ORDER BY DROPTIME DESC2.执行表的恢复 FLASHBACK TABLE TABLE_NAME TO BEFORE DROP;二:表数据恢复 对误删的表记录,只要没有 TRUNCATE 语句,就可以根据事务的提交时间进行选择恢复,一般步骤有:1

表单双引号问题

需要插入一个form表单,input输入框数据从外面传递过来获取,这里涉及到引号问题,由于我往input输入框填充的数据含有引号,这就导致了“字符串被截断”的问题.如 jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form); 后来改为如下代码就不会对双引号截断了,而这时对于单引号又存在问题了... jQuery(

Oracle生成查询包括对应于所有数据表记录语句中指定的字段名

应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,执行前改动成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库username变量,执行前改动成您要查询的数据库username

Oracle外部表详解(转载)

(外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中数据格式与创建表时access parameters中的定义需保持同步,适当用skip=1) 外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储