sql >> Database teknologi >  >> RDS >> Mysql

Parse &Sammenlign data ved hjælp af Coldfusion &MySQL

Begge svar har muligheder. Bare for at udvide dine muligheder lidt ..

Mulighed #1

HVIS mySQL understøtter en form for hashing, på en række-basis , kan du bruge en variant af comodoros forslag for at undgå svære sletninger.

Identificer ændret

For at identificere ændringer skal du lave en indre joinforbindelse på den primære nøgle og kontrollere hashværdierne. Hvis de er forskellige, er produktet blevet ændret og bør opdateres:

 OPDATERING Produkter 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 

Identificer slettet

Brug en simpel ydre joinforbindelse til at identificere poster, der ikke findes i den midlertidige tabel, og markér dem som "slettet"

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

Identificer ny

Brug endelig en lignende ydre samling til at indsætte eventuelle "nye" produkter.

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

Valgmulighed #2

Hvis hashing pr. række ikke er mulig, er en alternativ tilgang en variation af Sharondios forslag .

Tilføj en "status"-kolonne til den midlertidige tabel og markér alle importerede poster som "nye", "ændrede" eller "uændrede" gennem en række joinforbindelser. (Standarden skal "ændres").

Identificer FN-ændret

Brug først en indre sammenføjning på alle felter for at identificere produkter, der IKKE er ændret. (Bemærk, hvis din tabel indeholder nullbare felter, husk at bruge noget som sammensmelte Ellers kan resultaterne blive skæve, fordi null værdier er ikke lig med noget.

 OPDATERING Products_Temp tmp INNER JOIN Produkter p ON tmp.ProductID =p.ProductID SET tmp.Status ='Uændret' HVOR p.ProductName =tmp.ProductName AND p.Stock =tmp.Stock ...  

Identificer ny

Som før skal du bruge en ydre sammenføjning til at identificere "nye" poster.

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

Ved elimineringsproces bliver alle andre poster i temp-tabellen "ændret". Når du har beregnet statusserne, kan du opdatere produkttabellen:

 /* opdater ændrede produkter */ OPDATERING Produkter 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 ='Ændret' /* indsæt nye produkter */ INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. ) SELECT tmp.ProductStock, . , now() AS DateLastChanged, 0 AS IsDiscontinued, ... FROM Products_Temp tmp WHERE tmp.Status ='New' /* flag slettede poster */ 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. mysqli/mysql-forespørgsel inde i funktionen virker ikke

  2. Er der en måde at ikke bruge firkantede parenteser i SQL Server?

  3. Hvordan får man slutningen på en dag?

  4. MySQL MATCH virker ikke med to karakterer?