We help IT Professionals succeed at work.

Help with T SQL statement

simonsjd
simonsjd asked
on
87 Views
Last Modified: 2018-08-30
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

ste5anSenior Developer
CERTIFIED EXPERT

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

CERTIFIED EXPERT

Commented:
      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
Scott PletcherSenior DBA
CERTIFIED EXPERT
Most Valuable Expert 2018
Distinguished Expert 2019

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
CERTIFIED EXPERT
Most Valuable Expert 2018
Distinguished Expert 2019
Commented:
This problem has been solved!
(Unlock this solution with a 7-day Free Trial)
UNLOCK SOLUTION
simonsjdIT Manager

Author

Commented:
Many thanks - sorted
Scott PletcherSenior DBA
CERTIFIED EXPERT
Most Valuable Expert 2018
Distinguished Expert 2019

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

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions