simonsjd
asked on
Help with T SQL statement
I have very limited Microsoft SQL experience but need an efficient way to do this.
Table1
field1 field2 field3
Table2
field1 field2 field4
I want to work through table1 - first to last
check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'
if no match
create new record in table2
if match and table1.field2 <> table2.field2
update table2.field4
create new record in table2
Any help appreciated
Table1
field1 field2 field3
Table2
field1 field2 field4
I want to work through table1 - first to last
check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'
if no match
create new record in table2
if match and table1.field2 <> table2.field2
update table2.field4
create new record in table2
Any help appreciated
update table2.field4
create new record in table2
This bit is not very clear on your question. Are you doing BOTH? An update and creating a new record on Table2? What is the update going to be? Using MERGE, you will not be able to execute both. However, you could use the MERGE to perform the inserts, OUTPUT these results into a temporary table, and then execute the updates based on the temporary table. Something like:
-- Create a temporary table variable to hold the output actions.
DECLARE @changes TABLE(Change VARCHAR(20), T2RecordID, T2Field1, T2Field2, T2Field4, T2OldField4 );
MERGE Table2 as target
USING Table1 as source
ON ( target.field1 = source.field1 AND target.Column4 = 'Y' )
WHEN NOT MATCHED THEN INSERT ( fiel1, field2, field4 )
VALUES ( source.field1, source.field2, 'Y' )
WHEN MATCHED AND target.field2 <> source.field2 THEN UPDATE SET target.Column4 = '?'
OUTPUT $action, inserted.id /*assuming an autonumber field here*/, inserted.field1, inserted.field2, inserted.field4, deleted.field4 INTO @changes;
--@changes will now contain a record of all the changes that have been made. Use this data to do the "create new record in table2" as necessary.
ASKER
Sorry if I haven't explained the logic very well.
If I get a match on "check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'"
and also table1.field2 <> table2.field2
I need to update table2.field2 in the matched record and then create a new record in table 2
If I get a match on "check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'"
and also table1.field2 = table2.field2 I do nothing
If I get a match on "check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'"
and also table1.field2 <> table2.field2
I need to update table2.field2 in the matched record and then create a new record in table 2
If I get a match on "check table2 for match on table1.field1 = table2.field1 and table2.field4 = 'Y'"
and also table1.field2 = table2.field2 I do nothing
I don't know what you want to put in "field4" in the new row, so you'll have to fill that in below. I'm also assuming field2 can't be NULL -- if it can be, we'll have to adjust the comparison on field2.
INSERT INTO Table2 ( field1, field2, field4 )
SELECT t1.field1, t1.field2, ?.?
FROM Table1 t1
INNER JOIN Table2 t2 ON t2.field1 = t1.field1 AND t2.field4 = 'Y' AND t2.field2 <> t1.field2
UPDATE t2
SET field2 = t1.field2
FROM Table2 t2
INNER JOIN Table2 t2 ON t2.field1 = t1.field1 AND t2.field4 = 'Y' AND t2.field2 <> t1.field2
INSERT INTO Table2 ( field1, field2, field4 )
SELECT t1.field1, t1.field2, ?.?
FROM Table1 t1
INNER JOIN Table2 t2 ON t2.field1 = t1.field1 AND t2.field4 = 'Y' AND t2.field2 <> t1.field2
UPDATE t2
SET field2 = t1.field2
FROM Table2 t2
INNER JOIN Table2 t2 ON t2.field1 = t1.field1 AND t2.field4 = 'Y' AND t2.field2 <> t1.field2
ASKER
Thanks Scott. I think the only bit missing is create a new record in table2 if there is no match with table1?
Thanks
Thanks
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Many thanks - sorted
Great, glad I helped you arrive at a solution!
Open in new window