Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何更新和划分列值?_Sql_Oracle_Plsql - Fatal编程技术网

Sql 如何更新和划分列值?

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=

我有一个有两列的表。在第一列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=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。