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

4

3 に答える 3

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;

ここにsqlfiddleのデモがあります

しかし、クエリで使用できる値を含む列が必要になるのはなぜでしょうか?

于 2013-05-09T05:38:49.157 に答える
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に関する条件を追加します。ありがとう、通行人。

于 2013-05-09T05:31:13.197 に答える
-3
SET @rownum:=0; SELECT @rownum:=@rownum+1 AS name_order, names from name_table where dept_id=XXX;

working fine on mysql. 
于 2013-05-09T05:21:00.507 に答える