First a bit of friendly advice:
When performing an INSERT...SELECT... it is better to explicitly list the
source columns (part of the SELECT statement). Doing so will ensure that
if you re-order some columns or if you add/drop columns to/from one of the
tables participating in the SELECT portion of your statement that your
INSERT will still function. It is also the only way to perform an INSERT
so that an auto_increment column works properly. I know you end up with
longer statements but the statements are less likely to break and they are
easier to debug.
"Eve Atley" <[EMAIL PROTECTED]> wrote on 10/20/2004 01:31:59 PM:
>
> I am attempting to copy data from 1 table into another, based on certain
> criteria. I have set up the following queries, but am unsure if they
> will function properly:
>
> #This pulls back all data for matching candidates with keyword from
> RESUME and CANDIDATE
> SELECT * FROM wow.resume r INNER JOIN wow.candidate c WHERE r.Section_ID
> = '1' AND MATCH (r.Section_Value) AGAINST ('+baan' IN BOOLEAN MODE) AND
> c.Candidate_ID = r.Candidate_ID;
This query has a JOIN in it without an ON condition. Creating a JOIN in
this fashion relies on the optimizer to detect that you have a valid
table-to-table condition in your WHERE statement and apply it correctly.
If for some reason the optimizer misses this condition (c.Candidate_ID =
r.Candidate_ID) during the JOIN phase of the query (or if you neglected to
make one), you will produce a Cartesian product (every possible
combination of each row from both tables) of the tables you are joining
and will have to filter out all but the matching rows during the WHERE
phase of the query. I would re-write it this way:
SELECT *
FROM wow.resume r
INNER JOIN wow.candidate c
ON c.Candidate_ID = r.Candidate_ID
WHERE r.Section_ID = '1'
AND MATCH (r.Section_Value) AGAINST ('+baan' IN BOOLEAN MODE);
>
> #This must copy all corresponding fields from RESUME into RESUME_ERP
> *for each candidate ID previously found*
> INSERT INTO wow.resume_erp
> (Candidate_ID, Section_ID, Section_Value)
> SELECT SQL_CALC_FOUND_ROWS *
> FROM wow.resume r
> INNER JOIN wow.candidate c;
Here is an example of a INSERT...SELECT... that does not specify the
source columns. This is also an example of a Cartesian product. If you
have 12000 resumes and 10000 candidates then the resume_erp table will end
up with 12000000 (12 million) rows in it (12000 x 10000). This is probably
NOT what you wanted. I would probably rewrite it this way
INSERT INTO wow.resume_erp (Candidate_ID, Section_ID, Section_Value)
SELECT SQL_CALC_FOUND_ROWS c.candidate_id, r.Section_ID, r.Section_Value
FROM wow.resume r
INNER JOIN wow.candidate c
ON r.candidate_ID = c.candidate_ID;
I don't know all of your field names so I had to make up an ON clause.
Change the field names to match those actually in your system.
> #This must copy all corresponding fields from CANDIDATE into
> CANDIDATE_ERP *for each candidate ID previously found*
> INSERT INTO wow.candidate_erp
> (Candidate_ID, Vendor_ID, Last_Name, First_Name, Middle_Initial,
> Condition_Type, Employer, Country_ID, Visa_Status, Dt_Visa, MMDD_Birth,
> SSN, CSG_Comments, Working, Available, Start_Date, Location,
> HoldOnPeriod, Relocation, Tech_Ranking, Comm_Ranking, Availability,
> Cert_Comments, Dt_Submitted, Def_Rate, Def_Rate_Unit, Other_Country,
> Currency_id, Interview_Availability, Interview_Contact, US_Experience,
> Location_Country)
> SELECT SQL_CALC_FOUND_ROWS *
> FROM wow.resume r
> INNER JOIN wow.candidate c;
This is another example of a Cartesian product. This also another example
of a "naked" SELECT clause.
Specify your source columns (do not use "SELECT SQL_CALC_FOUND_ROWS *")
and add an ON constraint to your INNER JOIN so that the appropriately
related rows are matched up.
>
> Am I on the right track?
Yes, you were close. May I suggest a little reading?
http://dev.mysql.com/doc/mysql/en/JOIN.html
http://dev.mysql.com/doc/mysql/en/INSERT.html
http://dev.mysql.com/doc/mysql/en/INSERT_SELECT.html
>
> Please read further for the kind of data returned, if necessary.
>
> Thanks,
> Eve
>
<sample data snipped>