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

Analýza a porovnání dat pomocí Coldfusion a MySQL

Obě reakce mají možnosti. Jen pro trochu rozšíření možností ..

Možnost č. 1

KDYŽ mySQL podporuje určitý druh hašování, na základě řádků , můžete použít variantu návrh společnosti comodoro abyste se vyhnuli tvrdému smazání.

Identifikovat změněno

Chcete-li identifikovat změny, proveďte vnitřní spojení primárního klíče a zkontrolujte hodnoty hash. Pokud se liší, produkt byl změněn a měl by být aktualizován:

    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued  = 0
    WHERE  tmp.TheRowHash <> p.TheRowHash

Identifikovat smazané

Použijte jednoduché vnější spojení k identifikaci záznamů, které v dočasné tabulce neexistují, a označte je jako „smazané“

    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL

Identifikovat nové

Nakonec použijte podobný vnější spoj pro vložení jakýchkoli "nových" produktů.

    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    WHERE  p.ProductID IS NULL

Možnost č. 2

Pokud není hašování na řádek proveditelné, alternativním přístupem je variace návrhu Sharondio .

Přidejte do dočasné tabulky sloupec „stav“ a pomocí řady spojení označte všechny importované záznamy jako „nové“, „změněné“ nebo „nezměněné“. (Výchozí nastavení by mělo být "změněno").

Identifikujte UN-Changed

Nejprve použijte vnitřní spojení ve všech polích k identifikaci produktů, které se NEZMĚNILY. (Upozorňujeme, že pokud tabulka obsahuje pole s možnou hodnotou null, nezapomeňte použít něco jako coalesce Jinak mohou být výsledky zkreslené, protože null hodnoty se nerovnají ničemu.

    UPDATE  Products_Temp tmp INNER JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'Unchanged'
    WHERE   p.ProductName = tmp.ProductName
    AND     p.Stock = tmp.Stock
    ... 

Identifikovat nové

Stejně jako dříve použijte k identifikaci „nových“ záznamů vnější spojení.

    UPDATE  Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'New'
    WHERE   p.ProductID IS NULL

Procesem eliminace jsou všechny ostatní záznamy v dočasné tabulce "změněny". Jakmile spočítáte stavy, můžete aktualizovat tabulku Produkty:

    /*  update changed products */
    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued = 0
    WHERE  tmp.status = 'Changed'

    /*  insert new products */
    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp
    WHERE  tmp.Status = 'New'

    /* flag deleted records */
    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL


  1. RR vs YY v Oracle

  2. Vytvoření databáze PostgreSQL

  3. MySQL ORDER BY Pole data, které není ve formátu data

  4. Jak získat soubor z BLOB v Oracle?