Domanda

esiste un equivalente di ROWID di Oracle in MySQL?

delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)

Voglio fare un mysql equivalente di questa query !!!

Quello che sto cercando di fare è,: La my_table non ha alcuna chiave primaria .. sto cercando di eliminare i valori duplicati e imporre una chiave primaria (composito campo1, campo2) .. !!

È stato utile?

Soluzione

In MySQL di solito le variabili di sessione uso più adeguati per svolgere la funzionalità:

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

Ma non è possibile effettuare i tipi sul tavolo che si sta tentando di eliminare da in sottoquery.

UPD : ovvero sarà necessario creare una tabella temporanea, inserire la subquery che vanno alla tabella temporanea ed eliminare dalla tabella originale unendo con la tabella temporanea (avrete bisogno di un po 'di fila unica identifier):

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

Dal momento che è un'operazione volta, questo non dovrebbe portare troppo in alto.

Altri suggerimenti

Forse, sto fraintendendo la domanda, ma la vostra richiesta (anche in Oracle) non raggiungere il tuo obiettivo desiderato:

delete from my_table where rowid not in (select max(rowid) from 
my_table group by field1,field2)

MySQL equivalente è

SELECT @rowid:=max(rowid) from my_table;
DELETE FROP my_table where rowid != @rowid;

Questo spazzerà via tutte le righe tranne che per ultima.

Per eseguire una pulizia volta (rimuovendo i record duplicati) completo dei dati si può fare questo:

CREATE TABLE my_table2 SELECT distinct f1, f2, f3, etc from my_table;
DROP TABLE my_table;
ALTER TABLE my_table2 RENAME my_table;

Quindi aggiungere qualsiasi colonne e chiavi necessarie per ALTER TABLE. Sopra il codice potrebbe richiedere far cadere le chiavi esterne si potrebbe avere.

si può evitare la tabella temporanea utilizzando un'altra tabella derivata:

DELETE FROM my_table USING my_table JOIN (
    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) as duplicates
ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0
mysql> set @row_num = 0;

Il primo set rowId o riga num l'uso come segue:

mysql>  SELECT @row_num := @row_num + 1 as row_number,id,name,salary FROM employee
ORDER BY salary;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top