Link to home
Start Free TrialLog in
Avatar of simonsjd
simonsjdFlag for United Kingdom of Great Britain and Northern Ireland

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
Avatar of ste5an
ste5an
Flag of Germany image

hmm, not sure about your exact logic, but take a look at MERGE, e.g.

MERGE Table2 Dst
USING (   SELECT T.Column1 ,
                 T.Column2 ,
                 T.Column3
          FROM   Table1 T ) Src
ON (   Dst.Column1 = Src.Column1
       AND Dst.Column2 != SrcColumn2
       AND Dst.Column4 = 'Y' )
WHEN MATCHED THEN UPDATE SET Dst.Column4 = '?'
WHEN NOT MATCHED THEN INSERT ( Column1 ,
                               Column2 ,
                               Column4 )
                      VALUES ( Src.Column1, Column2, '?' )
OUTPUT DELETED.* ,
       $ACTION ,
       INSERTED.*;

Open in new window

      update table2.field4
      create new record in table2

Open in new window

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.

Open in new window

Avatar of simonsjd

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
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
Thanks Scott. I think the only bit missing is create a new record in table2 if there is no match with table1?
Thanks
ASKER CERTIFIED SOLUTION
Avatar of Scott Pletcher
Scott Pletcher
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Many thanks - sorted
Great, glad I helped you arrive at a solution!