sql >> Databáze >  >> RDS >> PostgreSQL

Zkontrolujte úplné duplicitní řádky ve velké tabulce

Chcete-li zjistit, zda nějaké existuje úplný duplikát (stejný ve všech sloupcích), toto je pravděpodobně nejrychlejší způsob:

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid <> t1.ctid
    )

NATURAL JOIN je velmi výhodná zkratka pro tento případ, protože (cituji manuál zde ):

EXISTUJE je pravděpodobně nejrychlejší, protože Postgres přestane hledat, jakmile je nalezen první duplikát. Protože s největší pravděpodobností nemáte index pokrývající celý řádek a vaše tabulka je obrovská, ušetříte tím hodně času.

Uvědomte si, že NULL je nikdy považováno za identické s jiným NULL . Pokud máte NULL hodnoty a považovat je za identické, museli byste udělat více.

ctid je systémový sloupec který lze (ab-) použít jako primární klíč ad-hoc, ale nemůže z dlouhodobého hlediska nahradit skutečný primární klíč definovaný uživatelem.

Zdá se, že zastaralá verze 8.1 nemá žádný <> operátor definovaný pro ctid . Zkuste přenést do textu :

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid::text <> t1.ctid::text
    )


  1. Vytvoření procedury MYSQL v Laravel 4 Migrations

  2. Proč sem Oracle přidává skrytý sloupec?

  3. zobrazit sadu výsledků z uložené procedury oracle 10g

  4. Transponovat řádek do sloupců pomocí MySQL bez použití UNIIONS?