如何更新和划分列值?

时间:2017-02-07 11:14:59

标签: 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 = 10000; X = 2的行需要命名为Y = 9999;我该怎么办?

我的第二个问题是:如何进行数学运算(SQL或PL / SQL) 这将只留下那些可以分成17的数字?

5 个答案:

答案 0 :(得分:3)

对于可被17整除的内容,请使用mod()

where mod(x,17) = 0 -- remainder (MOD) when divided by 17 = 0

答案 1 :(得分:2)

回答第一个问题:

update test1
set y = 10001 - x
;

commit;

答案 2 :(得分:1)

您不需要PL / SQL或更新声明:

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;

或者:

INSERT INTO test1 ( x, y )
WITH cte ( lvl ) AS (
  SELECT 1 FROM DUAL
UNION ALL
  SELECT lvl + 1
  FROM   cte
  WHERE  lvl < 10000
)
SELECT CASE MOD( lvl, 17 )
         WHEN 0
         THEN lvl * 3 -- Your "math operation"
         ELSE lvl
       END,
       10001 - lvl
FROM   cte;

但如果您需要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;
/

答案 3 :(得分:1)

一个非常简单的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);

答案 4 :(得分:1)

好的,如果你需要PL / SQL

begin
  update test1
  set y = 10001 - x;
end;
/
commit;