sql >> Databáze >  >> RDS >> Mysql

Odstranit duplicitní řádky a nechat pouze nejstarší řádek?

Protože sloupec id používáte jako indikátor toho, který záznam je 'původní':

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Tím zůstane jeden záznam na e-mailovou adresu.

upravit a přidat:

Pro vysvětlení výše uvedeného dotazu...

Smyslem je připojit se ke stolu proti sobě. Předstírejte, že máte dvě kopie tabulky, každá pojmenovaná jinak. Pak je můžete porovnat a najít nejnižší id nebo pro každou e-mailovou adresu. Pak byste viděli duplicitní záznamy, které byly vytvořeny později, a mohli je smazat. (Když jsem o tom přemýšlel, představoval jsem si Excel.)

Chcete-li provést tuto operaci na tabulce, porovnat ji se sebou a být schopni identifikovat každou stranu, používáte aliasy tabulky. x je alias tabulky. Je přiřazen v from klauzuli takto:from <table> <alias> . x lze nyní použít jinde ve stejném dotazu k odkazování na tuto tabulku jako zástupce.

delete x zahájí dotaz naší akcí a cílem. Provedeme dotaz na výběr záznamů z více tabulek a chceme odstranit záznamy, které se objevují v x .

Aliasy se používají k označení obou „instancí“ tabulky. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail narazí stůl proti sobě, kde se e-maily shodují. Bez klauzule where, která následuje, by byl každý záznam vybrán, protože by mohl být spojen proti sobě.

where klauzule omezuje záznamy, které jsou vybrány. where x.id > z.id umožňuje 'instanci' alias x obsahovat pouze záznamy, které odpovídají e-mailům, ale mají vyšší id hodnota. Data, která opravdu chcete mít v tabulce, jedinečné e-mailové adresy (s nejnižším ID) nebudou součástí x a nebudou smazány. Jediné záznamy v x budou duplicitní záznamy (e-mailové adresy), které mají vyšší id než původní záznam pro tuto e-mailovou adresu.

Spojení a klauzule where lze v tomto případě kombinovat:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Chcete-li předejít duplicitám, zvažte vytvoření sloupce subscriberEmail jako UNIKÁTNÍ indexovaný sloupec.



  1. Vyberte podle měsíce pole

  2. Práce s daty v PostgreSQL

  3. Omezení připojení MySQL z localhost pro zlepšení zabezpečení

  4. Dell Boomi