我有一个有两列的表。在第一列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的数字?
答案 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;