2013-05-09 71 views
3

我有一个查询我们可以用行数替换列的所有值吗?

select name,name_order from name_table where dept_id=XXX; 

和结果集中是

+------------+--------+ 
| name_order | name | 
+------------+--------+ 
| 0  | One | 
| 1  | Two | 
| 2  | Three | 
| 3  | four | 
| 6  | five | 
| 9  | six | 
+------------+--------+ 

我必须更新用于的dept_id的name_order,以这样的方式使得它们从0和 递增开始(针对的dept_id只)
注:name_order是不是索引
的出落得应该像

+------------+--------+ 
| name_order | name | 
+------------+--------+ 
| 0  | One | 
| 1  | Two | 
| 2  | Three | 
| 3  | four | 
| 4  | five | 
| 5  | six | 
+------------+--------+ 

我试图分析功能ROWNUMBER(),它并没有帮助提前

update name_table set name_order = (
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY name_order)-1 
) 
where dept_id=XXX order by name_order 

感谢 -R

回答

0
UPDATE NAME_TABLE A 
SET NAME_ORDER=(
    SELECT R 
    FROM (SELECT NAME,ROW_NUMBER() OVER(ORDER BY NAME_ORDER) R 
       FROM NAME_TABLE) B 
    WHERE A.NAME=B.NAME); 

http://www.sqlfiddle.com/#!4/6804a/1

UPDATE NAME_TABLE A 
SET NAME_ORDER=(
    SELECT R 
    FROM (SELECT NAME,DEPT_ID,ROW_NUMBER() OVER(PARTITION BY DEPT_ID ORDER BY NAME_ORDER)-1 R 
       FROM NAME_TABLE) B 
    WHERE A.NAME=B.NAME AND A.DEPT_ID=B.DEPT_ID /*AND A.DEPT_ID=XXX*/); 

添加有关条件dept_id为。谢谢路人。

+1

这会更接近OP的问题:http://www.sqlfiddle.com/#!4/f02c1/2 – Passerby 2013-05-09 05:45:15

+0

@Passerby是的,我没有不考虑dept_id.I更新我的答案。 – Gentlezerg 2013-05-09 05:58:30

-3
SET @rownum:=0; SELECT @rownum:[email protected]+1 AS name_order, names from name_table where dept_id=XXX; 

working fine on mysql. 
+0

这甚至不适用于Oracle的有效语法。 – Mat 2013-05-09 05:22:13

+0

同样谢谢。当我在oracle上运行时,第26行:SQLPLUS Command Skipped: – 2013-05-09 05:31:32

2

您可以用merge command

MERGE INTO name_table dst 
USING (SELECT t.*, row_number() over (partition BY dept_id ORDER BY name_order) -1 n 
     FROM name_table t) src 
ON (dst.dept_id = src.dept_id AND dst.name = src.name) 
WHEN MATCHED THEN UPDATE SET Dst.name_order = src.n; 

Here is a sqlfiddle demo

做,但为什么你想与值的列,你可以在查询?

+0

他可以将其用作此数据的UI输出的任意排序键,可以通过这种方式进行初始化并稍后进行更改。 – 2013-05-09 05:45:43

+0

实际上,我使用这些列值作为索引(但它并非实际索引)在JPA多对多关系中进行排序,这导致null对象缺少name_order – 2013-05-09 05:50:32

+0

(尽管我们在java侧有一个修复程序)来修复损坏的数据在数据库我想复活列值 – 2013-05-09 05:52:04

相关问题