Sql 东南方?这可能会导致很多不一致的地方。“我想把rollno 4改为2,并增加即将到来的数字;-但是你的结果显示2和2s的名称发生了变化,随后的名称被向下推1。那么你使用的是什么RDBMS…?@穿刺者实际上没有改变,这是我的错误问题。 ___________
Sql 东南方?这可能会导致很多不一致的地方。“我想把rollno 4改为2,并增加即将到来的数字;-但是你的结果显示2和2s的名称发生了变化,随后的名称被向下推1。那么你使用的是什么RDBMS…?@穿刺者实际上没有改变,这是我的错误问题。 ___________,sql,Sql,东南方?这可能会导致很多不一致的地方。“我想把rollno 4改为2,并增加即将到来的数字;-但是你的结果显示2和2s的名称发生了变化,随后的名称被向下推1。那么你使用的是什么RDBMS…?@穿刺者实际上没有改变,这是我的错误问题。 ______________________________ AdmissionNo RollNo Name ______________________________ 1001 1 A 1003
东南方?这可能会导致很多不一致的地方。“我想把rollno 4改为2,并增加即将到来的数字;-但是你的结果显示2和2s的名称发生了变化,随后的名称被向下推1。那么你使用的是什么RDBMS…?@穿刺者实际上没有改变,这是我的错误问题。
______________________________
AdmissionNo RollNo Name
______________________________
1001 1 A
1003 2 B
1005 3 C
1006 4 D
1008 5 E
-------------------------------
AdmissionNo RollNo Name
-------------------------------
1001 1 A
1006 2 D
1003 3 B
1005 4 C
1008 5 E
--------------------------------
DROP TABLE IF EXISTS T;
create table t
(AdmissionNo int, RollNo int, Name varchar(1));
insert into t values
(1001 , 1 , 'A'),
(1003 , 2 , 'B'),
(1005 , 3 , 'C'),
(1006 , 4 , 'D'),
(1008 , 5 , 'E');
select t.*,
case when rollno = 2 then (select name from t where rollno = 4)
when rollno > 2 and
rollno <> (select max(rollno) from t) then (select name from t t1 where t1.rollno < t.rollno order by t1.rollno desc limit 1)
else name
end
from t;
+-------------+--------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1001 | 1 | A | A |
| 1003 | 2 | B | D |
| 1005 | 3 | C | B |
| 1006 | 4 | D | C |
| 1008 | 5 | E | E |
+-------------+--------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.001 sec)
; with cte as (select a.AdmissionNo, a.RollNo, b.Name from student a
join student b on a.RollNo=b.RollNo+1
where a.RollNo between 3 and 4
union all
select a.AdmissionNo, a.RollNo, b.Name from student a
left join student b on a.RollNo+2=b.RollNo
where a.RollNo=2)
update a set a.Name = b.name
from student a
join cte b on a.rollno=b.rollno
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(admission_no INT NOT NULL PRIMARY KEY
,roll_no INT NOT NULL
,name CHAR(1) NOT NULL
);
INSERT INTO my_table VALUES
(1001,1,'A'),
(1003,2,'B'),
(1005,3,'C'),
(1006,4,'D'),
(1008,5,'E');
SELECT *
, CASE WHEN roll_no = 4 THEN 2
WHEN roll_no >= 2 AND roll_no < 4 THEN roll_no + 1
ELSE roll_no END x FROM my_table;
+--------------+---------+------+---+
| admission_no | roll_no | name | x |
+--------------+---------+------+---+
| 1001 | 1 | A | 1 |
| 1003 | 2 | B | 3 |
| 1005 | 3 | C | 4 |
| 1006 | 4 | D | 2 |
| 1008 | 5 | E | 5 |
+--------------+---------+------+---+
5 rows in set (0.00 sec)
UPDATE my_table x
JOIN
( SELECT *
, CASE WHEN roll_no = 4 THEN 2
WHEN roll_no >= 2 AND roll_no < 4 THEN roll_no + 1
ELSE roll_no END n
FROM my_table
) y
ON y.admission_no = x.admission_no
SET x.admission_no = y.n;
SET @source = 1, @target = 5;
SELECT *
, CASE WHEN roll_no = GREATEST(@source,@target) THEN LEAST(@source,@target)
WHEN roll_no >= LEAST(@source,@target) AND roll_no < GREATEST(@source,@target) THEN roll_no + 1
ELSE roll_no END x
FROM my_table;