Mysql
 sql >> Database >  >> RDS >> Mysql

Equivalente a RowID di Oracle in MySQL

In MySql di solito usi le variabili di sessione per ottenere la funzionalità:

SELECT @rowid:[email protected]+1 as rowid
FROM table1, (SELECT @rowid:=0) as init
ORDER BY sorter_field

Ma non puoi effettuare ordinamenti sulla tabella da cui stai tentando di eliminare nelle sottoquery.

UPD :ovvero dovrai creare una tabella temporanea, inserire la sottoquery di intervallo nella tabella temporanea ed eliminare dalla tabella originale unendoti alla tabella temporanea (avrai bisogno di un identificatore di riga univoco):

CREATE TEMPORARY TABLE duplicates ...

INSERT INTO duplicates (rowid, field1, field2, some_row_uid)
SELECT
  @rowid:=IF(@f1=field1 AND @f2=field2, @rowid+1, 0) as rowid,
  @f1:=field1 as field1,
  @f2:=field2 as field2,
  some_row_uid
FROM testruns t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init
ORDER BY field1, field2 DESC;

DELETE FROM my_table USING my_table JOIN duplicates
  ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0

Poiché si tratta di un'operazione una tantum, non dovrebbe comportare un sovraccarico.