2013-05-09 3 views
3

i ont une requêtePouvons-nous remplacer toutes les valeurs de la colonne par des numéros de ligne?

select name,name_order from name_table where dept_id=XXX; 

et l'ensemble de résultats est

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

i mettre à jour le name_order pour le dept_id, de telle sorte qu'elles commencent à partir de 0 et incrémentée (pour que dept_id seulement)
Note: name_order n'est pas un indice
la sortie viennent devrait être comme

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

i essayé la fonction d'analyse rowNumber(), il n'a pas aidé

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 

Merci à l'avance R

Répondre

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*/); 

Ajouter la condition à propos de dept_id. Merci Passerby.

+1

Ce serait plus proche de la question de l'OP: http://www.sqlfiddle.com/#!4/f02c1/2 – Passerby

+0

@Passerby Oui, je didn Ne considérez pas le dept_id.Je mets à jour ma réponse. – Gentlezerg

-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

Cette syntaxe n'est même pas valide pour Oracle. – Mat

+0

merci pareil. Je suis suivi quand je cours à oracle, ligne 26: SQLPLUS Command Skipped: –

2

Vous pouvez le faire avec un 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

Mais pourquoi voudriez-vous une colonne avec les valeurs que vous pouvez avoir dans une requête?

+0

il pourrait l'utiliser comme une clé de tri arbitraire pour la sortie UI de ces données, qui pourrait être initialisé de cette façon et modifié plus tard. –

+0

en fait, j'utilise ces valeurs de colonne comme index (mais son index pas réel) pour trier dans JPA many to many relation, ce qui conduit à des objets nuls pour missing name_order –

+0

bien que nous ayons eu un correctif côté java, pour corriger les données corrompues dans la base de données je voudrais ressusciter les valeurs de colonne –

Questions connexes