Sorry, I meant to send this reply to the whole mailing list, not just to
Shawn.

Rhino

----- Original Message ----- 
From: "Rhino" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, September 14, 2004 2:18 PM
Subject: Re: update/join question..


> Okay, I stand corrected. Apparently, MySQL allows updates of joins.
>
> My apologies, I didn't mean to steer anyone down the wrong path.
>
> Thanks for setting me straight, Shawn!
>
> Rhino
>
> ----- Original Message ----- 
> From: <[EMAIL PROTECTED]>
> To: "Rhino" <[EMAIL PROTECTED]>
> Cc: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
> Sent: Tuesday, September 14, 2004 2:07 PM
> Subject: Re: update/join question..
>
>
> > Rhino, I hate to burst your bubble but JOINS __are allowed__ in MySQL
> > updates. I use them all the time.
> >
> > http://dev.mysql.com/doc/mysql/en/UPDATE.html
> >
> > At the top of the page are the syntaxes for single-table and
> > multiple-table updates:
> >
> > The key here is that whatever you put _between_ the words FROM and WHERE
> > in a normal query will be what you need to UPDATE.  (I personally
> > discourage anyone from using the "comma join" method of declaring table
> > joins so I won't use it in my examples. It's a valid syntax but if you
> > forget to put the right comparisons into your WHERE clause, you end up
> > with problems. It's even easier with using JOINS in an UPDATE as the
WHERE
> > clause is even farther away from the tables)
> >
> > This query will give me a list of all of the companies who have
contracts
> > managed by manager 15:
> >
> > SELECT DISTINCT t1.*
> > FROM Company t1
> > INNER JOIN Contract t2
> >         on t1.id = t2.Company_id
> > WHERE t2.Manager_ID = 15
> >
> > Imagine a situation where you needed to update contract.ManagerID with a
> > new manager (Manager 15 was promoted) but you are not reassigning ALL of
> > the contract accounts to the same person. You want to split it up so
that
> > companies A-L go to manger 12 and companies M-Z to manager 34. You *CAN*
> > do this in a single statement but that would confuse my example. I will
do
> > the reassignments in two statements so that you can see the pattern
> > better:
> >
> > UPDATE Company t1
> > INNER JOIN Contract t2
> >         on t1.id = t2.Company_ID
> > SET t2.Manager_Id = 12
> > WHERE t2.Manager_ID = 15
> >         AND t1.Name <'m';
> >
> > UPDATE Company t1
> > INNER JOIN Contract t2
> >         on t1.id = t2.Company_ID
> > SET t2.Manager_Id = 34
> > WHERE t2.Manager_ID = 15
> >         AND t1.Name >= 'm';
> >
> >
> > The WHERE clause didn't need to change but what came after the FROM in a
> > query has been moved to right after the UPDATE.  The SET clause can
assign
> > values to or get values from ANY column from any of the tables
> > participating in the UPDATE clause. Let me get back on topic...
> >
> > Bruce, you started with this SELECT:
> >
> > SELECT u1.urltype as type,
> >         p1.fileID as fileID,
> >         l1.process as process,
> >         l1.status as status
> > FROM university_urlTBL as u1
> > RIGHT JOIN parsefileTBL as p1
> >         on u1.ID =p1.university_urlID
> > INNER JOIN latestParseStatusTBL as l1
> >         on p1.fileID = l1.itemID
> > WHERE u1.universityID='40';
> >
> > You should be able to transform this query into:
> >
> > UPDATE university_urlTBL as u1
> > RIGHT JOIN parsefileTBL as p1
> >         on u1.ID =p1.university_urlID
> > INNER JOIN latestParseStatusTBL as l1
> >         on p1.fileID = l1.itemID
> > SET ....
> > WHERE ...
> >
> > Your SET and WHERE clauses can refer to any column in any of the three
> > tables participating in the JOINs. Guessing from your example they would
> > look like
> >
> >
> > SET l1.process = '1', l1.status = '13'
> > WHERE u1.universityID = '40'
> >
> > <BEGIN RANT>
> > If "process", "status", and "universityID" are numeric fields... DROP
> > THOSE QUOTES. They are not necessary and require the engine to take an
> > extra conversion.
> > <END RANT>
> > sorry... just had to get that off my chest.  :-D
> >
> > Shawn Green
> > Database Administrator
> > Unimin Corporation - Spruce Pine
> >
> >
> >
> > "Rhino" <[EMAIL PROTECTED]> wrote on 09/14/2004 01:24:19 PM:
> >
> > >
> > > ----- Original Message ----- 
> > > From: "bruce" <[EMAIL PROTECTED]>
> > > To: <[EMAIL PROTECTED]>
> > > Sent: Tuesday, September 14, 2004 11:45 AM
> > > Subject: update/join question..
> > >
> > >
> > > > hi...
> > > >
> > > > a question on how to do an update on a table that depends on
> > 'left/right'
> > > > joins with other tables...
> > > >
> > > > i have the following select that works.
> > > >
> > > > select
> > > > u1.urltype as type,
> > > > p1.fileID as fileID,
> > > > l1.process as process,
> > > > l1.status as status
> > > > from university_urlTBL as u1
> > > > right join parsefileTBL as p1
> > > > on u1.ID =p1.university_urlID
> > > > join latestParseStatusTBL as l1
> > > > on p1.fileID = l1.itemID
> > > > where u1.universityID='40';
> > > >
> > > >
> > > > i simply wnat to be able to update the latestParseStatusTBL based
upon
> > the
> > > > joins between the tables...
> > > >
> > > > (something like...)
> > > > update
> > > > latestParseStatusTBL,
> > > > university_urlTBL as u1
> > > > right join parsefileTBL as p1
> > > > on u1.ID =p1.university_urlID
> > > > join latestParseStatusTBL as l1
> > > > on p1.fileID = l1.itemID
> > > > where u1.universityID='40'
> > > > set
> > > > l1.process = '1',
> > > > l1.status = '13';
> > > >
> > > > i've tried a number of derivatives of this approach with no luck..
i'm
> > > > missing something simple..
> > > >
> > > You haven't explained what you meant by "with no luck"; did the
updates
> > fail
> > > with an error message or without a message? If there was a message,
what
> > did
> > > it say? I'm guessing that they failed with an error message but that
the
> > > message was cryptic....
> > >
> > > I'm not overly fluent with MySQL yet but in 20 years of using DB2,
I've
> > > always been told that you can't update a join, you can only update an
> > > individual table. I assume that is true of all relational databases,
> > > including MySQL, but I don't know that for an absolute fact.
> > >
> > > > searching through mysql.com/google hasn't shed much light!!
> > > >
> > > Perhaps because this is such a fundamental concept that no one thought
> > it
> > > worth putting in a manual; they just assumed it would be told to you
> > > wherever you learned basic relational concepts. If so, that is
assuming
> > that
> > > everyone working with relational databases had some exposure to theory
> > > first; I think that's a very dubious assumption.
> > >
> > > > any ideas/comments/asssistance/thoughts/etc..
> > > >
> > > There ought to be a clear error message every time you try to update,
> > > insert, or delete from a join that says these operations cannot be
done
> > on
> > > joins. The manuals for every relational database should state that
> > Insert,
> > > Update, and Delete do not work on joins, both in the reference section
> > for
> > > the Insert, Update, and Delete statements and in the concepts section.
> > >
> > > Rhino
> > >
> > >
> > >
> > > -- 
> > > MySQL General Mailing List
> > > For list archives: http://lists.mysql.com/mysql
> > > To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
> > >
> >
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to