Help with T SQL statement

simonsjd
simonsjd used Ask the Experts™
on
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
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
ste5anSenior Developer

Commented:
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

simonsjdIT Manager

Author

Commented:
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
Ensure you’re charging the right price for your IT

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden using our free interactive tool and use it to determine the right price for your IT services. Start calculating Now!

Scott PletcherSenior DBA
Most Valuable Expert 2018
Top Expert 2014

Commented:
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
simonsjdIT Manager

Author

Commented:
Thanks Scott. I think the only bit missing is create a new record in table2 if there is no match with table1?
Thanks
Senior DBA
Most Valuable Expert 2018
Top Expert 2014
Commented:
So you also want to INSERT if there's no match at all on table2??

--first:
INSERT INTO Table2 ( field1, field2, field4 )
SELECT t1.field1, t1.field2, ?.?
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t2.field1 = t1.field1 AND t2.field4 = 'Y' AND t2.field2 <> t1.field2
WHERE t2.field1 IS NULL
--then:
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
simonsjdIT Manager

Author

Commented:
Many thanks - sorted
Scott PletcherSenior DBA
Most Valuable Expert 2018
Top Expert 2014

Commented:
Great, glad I helped you arrive at a solution!

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial