Sql 如何更新和划分列值?
我有一个有两列的表。在第一列X中有从1到10000的数字。第二列Y为空。我是这样设置的:Sql 如何更新和划分列值?,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个有两列的表。在第一列X中有从1到10000的数字。第二列Y为空。我是这样设置的: create table test1 ( x number, y number ); begin for l in 1..10000 LOOP insert into test1(x) values(l); end loop; commit; end; 我的第一个问题是:我需要使用update语句将Y列的值按与X列相反的顺序设置,即从10000到1。X=1的行需要Y=
create table test1 (
x number,
y number
);
begin
for l in 1..10000 LOOP
insert into test1(x)
values(l);
end loop;
commit;
end;
我的第一个问题是:我需要使用update语句将Y列的值按与X列相反的顺序设置,即从10000到1。X=1的行需要Y=10000;X=2的行需要命名为Y=9999;等等,我该怎么做
我的第二个问题是:如何执行SQL或PL/SQL数学运算
这将在列中只留下那些可分为17的数字?回答第一个问题:
update test1
set y = 10001 - x
;
commit;
对第一个问题的答复:
update test1
set y = 10001 - x
;
commit;
对于可被17整除的部分,使用
对于可被17整除的部分,使用
您不需要PL/SQL或update语句:
INSERT INTO test1 ( x, y )
SELECT CASE MOD( lvl, 17 )
WHEN 0
THEN lvl * 3 -- Your "math operation"
ELSE lvl
END,
10001 - lvl
FROM ( SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= 10000 );
COMMIT;
或:
但如果需要PL/SQL,则可以将其包装在匿名块中:
DECLARE
upper_bound CONSTANT NUMBER := 10000;
BEGIN
INSERT INTO test1 ( x, y )
SELECT CASE MOD( lvl, 17 )
WHEN 0
THEN lvl * 3 -- Your "math operation"
ELSE lvl
END,
upper_bound + 1 - lvl
FROM ( SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= upper_bound );
COMMIT;
END;
/
您不需要PL/SQL或update语句:
INSERT INTO test1 ( x, y )
SELECT CASE MOD( lvl, 17 )
WHEN 0
THEN lvl * 3 -- Your "math operation"
ELSE lvl
END,
10001 - lvl
FROM ( SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= 10000 );
COMMIT;
或:
但如果需要PL/SQL,则可以将其包装在匿名块中:
DECLARE
upper_bound CONSTANT NUMBER := 10000;
BEGIN
INSERT INTO test1 ( x, y )
SELECT CASE MOD( lvl, 17 )
WHEN 0
THEN lvl * 3 -- Your "math operation"
ELSE lvl
END,
upper_bound + 1 - lvl
FROM ( SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= upper_bound );
COMMIT;
END;
/
一个非常简单的SQL查询就足以解决您的问题。希望能有帮助
MERGE INTO TEST1 USING
( SELECT X,ROW_NUMBER() over(order by 1 ASC) Y FROM TEST1 ORDER BY 1 DESC
)a ON (TEST1.X =a.X )
WHEN matched THEN
UPDATE SET TEST1.Y = DECODE(MOD(A.Y,17),0,A.Y,NULL);
一个非常简单的SQL查询就足以解决您的问题。希望能有帮助
MERGE INTO TEST1 USING
( SELECT X,ROW_NUMBER() over(order by 1 ASC) Y FROM TEST1 ORDER BY 1 DESC
)a ON (TEST1.X =a.X )
WHEN matched THEN
UPDATE SET TEST1.Y = DECODE(MOD(A.Y,17),0,A.Y,NULL);
好的,如果您在PL/SQL中需要它
begin
update test1
set y = 10001 - x;
end;
/
commit;
好的,如果您在PL/SQL中需要它
begin
update test1
set y = 10001 - x;
end;
/
commit;
@如果纯sql可以完成这项工作,为什么需要pl/sql?@СББББю。好的,教训是,如果你能用纯SQL做,不要用PL/SQL或任何其他语言做循环。@СМБББю-如果纯SQL能做这项工作,为什么你需要PL/SQL?@СМББю。那么教训是,,不要在PL/SQL或任何其他语言循环中使用,如果你可以在纯SQL中使用。谢谢,真棒,你能给我PL/SQL中的示例吗?也谢谢,真棒,你能给我PL/SQL中的示例吗?也可以添加标签编辑并将此答案与以前的答案合并,而不是发布另一个答案。添加标签编辑并将此答案与你的答案合并如果您当前的目标是学习PL/SQL,并且您只是为了练习,请在您的帖子中这样说,以避免所有不必要的问题。所有人都正确地认为所有这些都应该在SQL中完成;唯一有意义的例外是,如果您这样做是为了学习,而现在您正在学习PL/SQL,而不是SQL。如果您当前的目标是学习PL/SQL,并且您只是为了练习,请在您的帖子中这样说,以避免所有不必要的问题。所有人都正确地认为所有这些都应该在SQL中完成;唯一有意义的例外是,如果您这样做是为了学习,而现在您正在学习PL/SQL,而不是SQL。