Avatar of simonsjd
simonsjd
Flag 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
* T-SQLMicrosoft SQL Server

Avatar of undefined
Last Comment
Scott Pletcher

8/22/2022 - Mon
ste5an

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

Mlanda T

      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

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
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
Scott Pletcher

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
simonsjd

ASKER
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
Scott Pletcher

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
simonsjd

ASKER
Many thanks - sorted
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
Scott Pletcher

Great, glad I helped you arrive at a solution!