Domanda

Ho una tabella nel mio database che ha record duplicati che voglio eliminare. Non voglio creare una nuova tabella con voci distinte per questo. Quello che voglio è eliminare le voci duplicate dalla tabella esistente senza la creazione di alcuna nuova tabella. C'è un modo per farlo?

 id           action
 L1_name      L1_data
 L2_name      L2_data
 L3_name      L3_data   
 L4_name      L4_data
 L5_name      L5_data
 L6_name      L6_data
 L7_name      L7_data
 L8_name      L8_data
 L9_name      L9_data
 L10_name     L10_data
 L11_name     L11_data
 L12_name     L12_data
 L13_name     L13_data 
 L14_name     L14_data
 L15_name     L15_data

vedi questi sono tutti i miei campi:
id è unico per ogni riga.
L11_data è unico per il rispettivo campo di azione.
L11_data sta avendo nomi di società mentre action sta avendo il nome dei settori.

Quindi nei miei dati ho un nome duplicato delle aziende in L11_data per i rispettivi settori.

Quello che voglio è avere un nome univoco e altri dati delle aziende nel settore specifico memorizzati in azione. Spero di aver dichiarato il mio problema in modo tale che tu possa capirlo.

È stato utile?

Soluzione

Sì, supponendo che tu abbia un campo ID univoco, puoi eliminare tutti i record uguali tranne l'ID, ma non hanno " l'ID minimo " per il loro gruppo di valori.

Esempio di query:

DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)

Note:

  • Ho scelto liberamente " Tabella " e "ID" come nomi rappresentativi
  • L'elenco dei campi (" Field1, Field2, ... ") dovrebbe includere tutti i campi tranne l'ID
  • Potrebbe trattarsi di una query lenta a seconda del numero di campi e righe, tuttavia mi aspetto che vada bene rispetto alle alternative

MODIFICA: Nel caso in cui non si disponga di un indice univoco, la mia raccomandazione è semplicemente quella di aggiungere un indice univoco auto-incrementale. Principalmente perché ha un buon design, ma anche perché ti permetterà di eseguire la query sopra.

Altri suggerimenti

ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

I duplicati ottengono NULL, quindi puoi eliminarli

DELETE
FROM table_x a
WHERE rowid < ANY (
  SELECT rowid
  FROM table_x b
  WHERE a.someField = b.someField
   AND a.someOtherField = b.someOtherField
  )
WHERE (
  a.someField,
  a.someOtherField
  ) IN (
  SELECT c.someField,
   c.someOtherField
  FROM table_x c
  GROUP BY c.someField,
   c.someOtherField
  HAVING count(*) > 1
  )

Nella query precedente la combinazione di someField e someOtherField deve identificare distintamente i duplicati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top