Convert SQL 2008 Query to MySQL 5

I have a SQL server 2008 query that uses the new MERGE statement, and I need to convert it to MySQL 5.  Needless to say, I'm having some problems doing so.  I've looked into the MERGE statement with MySQL, but it seems to be different and not exactly what I'm looking for.  Maybe I'm just not understanding it.  Can anyone help me in converting this or point me in the direction for MySQL 5 equivalent?

Thanks.
MERGE INTO [Movies] As [target]
    USING (SELECT [Dbid], [Status], Studio, Released, Sound, Versions, Price, Rating, [Year], Genre, Aspect, UPC, DVDReleaseDate, [TimeStamp], Name FROM MoviesStaging) AS source
    ON ([target].[Dbid] = source.[Dbid])
    WHEN MATCHED THEN 
        UPDATE SET	Name = source.Name,
			[Dbid] = source.[Dbid],
			[Status] = source.[Status],
			Released = source.Released,
			Sound = source.Sound,
			Versions = source.Versions,
			Price = source.Price,
			Rating = source.Rating,
			[Year] = source.[Year],
			Genre = source.Genre,
			Aspect = source.Aspect,
			UPC = source.UPC,
			DVDReleaseDate = source.DVDReleaseDate,
			[TimeStamp] = source.[TimeStamp]					
	WHEN NOT MATCHED THEN	
	    INSERT ([Dbid], [Status], Studio, Released, Sound, Versions, Price, Rating, [Year], Genre, Aspect, UPC, DVDReleaseDate, [TimeStamp], Name)
	    VALUES (source.[Dbid], source.[Status], source.Studio, source.Released, source.Sound, source.Versions, source.Price, source.Rating, source.[Year], source.Genre, source.Aspect, source.UPC, source.DVDReleaseDate, source.[TimeStamp], source.Name);

Open in new window

Phreak3ebAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
MERGE command is not available in MYSQL. You need to update the existing records and Insert the Missing records.

Logic for your conversion:

1. If a record exists, then update those records into Movies table
2. Else Insert those records into Movies table.
0
Mark WillsTopic AdvisorCommented:
Agree with rrjegan17... basically becomes a two part process :


    UPDATE Movies SET	Name = source.Name,
			[Dbid] = source.[Dbid],
			[Status] = source.[Status],
			Released = source.Released,
			Sound = source.Sound,
			Versions = source.Versions,
			Price = source.Price,
			Rating = source.Rating,
			[Year] = source.[Year],
			Genre = source.Genre,
			Aspect = source.Aspect,
			UPC = source.UPC,
			DVDReleaseDate = source.DVDReleaseDate,
			[TimeStamp] = source.[TimeStamp]					
    From Movies
    inner join MoviesStaging as source on movies.[Dbid] = source.[Dbid]
 
 
 
    INSERT movies ([Dbid], [Status], Studio, Released, Sound, Versions, Price, Rating, [Year], Genre, Aspect, UPC, DVDReleaseDate, [TimeStamp], Name)
    select source.[Dbid], source.[Status], source.Studio, source.Released, source.Sound, source.Versions, source.Price, source.Rating, source.[Year], source.Genre, source.Aspect, source.UPC, source.DVDReleaseDate, source.[TimeStamp], source.Name
    From MoviesStaging as source
    left outer join Movies on movies.[Dbid] = source.[Dbid]
    where movies.[dbid] is NULL

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Phreak3ebAuthor Commented:
I'm clearly an SQL noob.  I'm trying to test the UPDATE statement with no luck.  I got the INSERT statement to work though.  Whenever I run the update statement I get:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'From Movies inner join MoviesStaging as source on Movies.Dbid ' at line 16

Here's the slightly modified update statement you gave me.

UPDATE Movies SET
Name = source.Name,
DBID = source.DBID,
Status = source.Status,
ReleaseDate = source.ReleaseDate,
Studio = source.Studio,
Sound = source.Sound,
Versions = source.Versions,
Price = source.Price,
Rating = source.Rating,
Year = source.Year,
Genre = source.Genre,
Aspect = source.Aspect,
UPC = source.UPC,
DVDReleaseDate = source.DVDReleaseDate,
Movies.Timestamp = source.Timestamp
From Movies inner join MoviesStaging as source on Movies.DBID = source.DBID

Open in new window

0
Newly released Acronis True Image 2019

In announcing the release of the 15th Anniversary Edition of Acronis True Image 2019, the company revealed that its artificial intelligence-based anti-ransomware technology – stopped more than 200,000 ransomware attacks on 150,000 customers last year.

Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
The above UPDATE statement is of MS SQL syntax. And you need a MySQL Syntax to make it work.

Hope this helps
UPDATE Movies,MoviesStaging
SET
 Movies.Name = MoviesStaging.Name,
 Movies.DBID = MoviesStaging.DBID,
 Movies.Status = MoviesStaging.Status,
 Movies.ReleaseDate = MoviesStaging.ReleaseDate,
 Movies.Studio = MoviesStaging.Studio,
 Movies.Sound = MoviesStaging.Sound,
 Movies.Versions = MoviesStaging.Versions,
 Movies.Price = MoviesStaging.Price,
 Movies.Rating = MoviesStaging.Rating,
 Movies.Year = MoviesStaging.Year,
 Movies.Genre = MoviesStaging.Genre,
 Movies.Aspect = MoviesStaging.Aspect,
 Movies.UPC = MoviesStaging.UPC,
 Movies.DVDReleaseDate = MoviesStaging.DVDReleaseDate,
 Movies.Timestamp = MoviesStaging.Timestamp
Where Movies.DBID = MoviesStaging.DBID

Open in new window

0
Mark WillsTopic AdvisorCommented:
Ooops, sorry about that... Well caught rrjegan17.
0
Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
>> Well caught rrjegan17.

It happens..And not a problem
Even I did this mistake earlier and that's why got it this time..

Waiting for Phreak3eb's comment now.
0
Phreak3ebAuthor Commented:
Thanks guys.  I will try this later today when I'm available and get back to you.
0
Phreak3ebAuthor Commented:
Ok.  Tried the update and the insert again tonight.  Both "worked", but the insert reported 1 warning, the update reported 18 changes.  Is there a way to get these queries to output that information?  Sorry, I know this question goes a bit off from the original question, but it's kind of part of the overall solution.
0
Mark WillsTopic AdvisorCommented:
Depends a little bit From procedures or your code, you can use the mysql_affected_rows() function : http://dev.mysql.com/doc/refman/6.0/en/mysql-affected-rows.html

if running within a procedure or interactively can use the row_count() function immediately following your insert or update statement e.g.

Insert table (columns....)
select columns...
from datasource

select row_count()

And this time i checked to make sure I am in the MySQL frame of mind :)
0
Phreak3ebAuthor Commented:
Thanks for all the help guys.
0
Mark WillsTopic AdvisorCommented:
No problems, and sorry for that little mind lapse earlier - glad rrjegan17 was there to catch....



0
Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
Welcome..
And thanks Mark too.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
MySQL Server

From novice to tech pro — start learning today.