db2 如何按另一个表中的值对行进行排序

abithluo  于 2022-12-04  发布在  DB2
关注(0)|答案(2)|浏览(174)

有一个表有一个空列,我需要用row_number()填充这个列,并根据其他表中的值对其排序。我的CTE可以工作,但我不能更新第二个表。
这是CTE(有效)
with testy(a, b, c) as (select t1.empno, t2.birthdate, ROW_NUMBER() OVER(ORDER BY t2.birthdate DESC) as order_by_id from test_tab as t1 join employee as t2 on t2.empno = t1.empno)
此请求更新列但不起作用

with testy(a, b, c) as (select 
                           t1.empno
                           , t2.birthdate
                           , ROW_NUMBER() OVER(ORDER BY t2.birthdate DESC) as order_by_id  
                       from test_tab as t1 join employee as t2 on t2.empno = t1.empno)
update test_tab
set test_tab.id = testy.b
where test_tab.empno = testy.a
zlhcx6iw

zlhcx6iw1#

如果您在Db2上执行LUW,则支持UPDATE FROM SELECT语法。
MERGE也可用于其它情况。
请注意,您的子选择不能包含EMPNO的重复项。

CREATE TABLE TEST_TAB (EMPNO INT, ID INT);
INSERT INTO TEST_TAB (EMPNO) VALUES 10, 20;

CREATE TABLE EMPLOYEE (EMPNO INT, BIRTHDATE DATE);
INSERT INTO EMPLOYEE (EMPNO, BIRTHDATE)
VALUES
  (10, '1970-01-01'::DATE)
, (20, '1980-01-01'::DATE)

UPDATE TEST_TAB T
SET ID = E. order_by_id  
FROM 
(
select 
  t1.empno
, ROW_NUMBER() OVER (ORDER BY t2.birthdate DESC) as order_by_id  
from test_tab as t1 
join employee as t2 on t2.empno = t1.empno
) E
WHERE T.EMPNO = E.EMPNO;

SELECT * FROM TEST_TAB;

| EMPNO公司|识别码|
| - -|- -|
| 10个|2个|
| 二十个|一个|
fiddle

vdgimpew

vdgimpew2#

您的查询应该会得到一个错误,指出testy.B是未知的
但是你可以做

with testy(a, b, c) as (select 
                           t1.empno
                           , t2.birthdate
                           , ROW_NUMBER() OVER(ORDER BY t2.birthdate DESC) as order_by_id  
                       from test_tab as t1 join employee as t2 on t2.empno = t1.empno)
update test_tab
set test_tab.id = (SELECT testy.b FROM testy where test_tab.empno = testy.a)

相关问题