Hello Experts,
I having some master tables "#ACTION_MASTER" & "#RPT_MILE_MASTER" and a link table "#ACTION_MILE_RPT_LINK" showing their relationship.
And again I having a derive table "#TBL" to finally update the master table ''#ACTION_MASTER".
I am able to do the task with below approach and I would like to know how to optimize it, please suggest and let me know for any other information. Thanks!
CREATE TABLE #ACTION_MASTER (UID INT, ACTION_ID INT, IS_ACTV BIT) INSERT INTO #ACTION_MASTER VALUES (1, 102, 1), (2, 103, 1) --SELECT * FROM #ACTION_MASTER CREATE TABLE #RPT_MILE_MASTER (UID INT, RPT_ID INT, MILE_ID INT, MILE_STATUS INT) INSERT INTO #RPT_MILE_MASTER VALUES (1, 12, 1, 5), (2, 13, 2, 2) --SELECT * FROM #RPT_MILE_MASTER CREATE TABLE #ACTION_MILE_RPT_LINK (LINK_ID INT, ACTION_ID INT, RPT_ID INT, MILE_ID INT) INSERT INTO #ACTION_MILE_RPT_LINK VALUES (1, 102, 12, 1), (2, 102, 13, 2), (3, 103, 13, 2) --SELECT * FROM #ACTION_MILE_RPT_LINK CREATE TABLE #TBL (RPT_ID INT, MILE_ID INT, MILE_STATUS INT) INSERT INTO #TBL VALUES (13, 1, 5), (13, 2, 5) --SELECT * FROM #TBL DECLARE @ACTION_ID INT DECLARE DB_CURSOR CURSOR FOR SELECT DISTINCT ACTION_ID FROM #ACTION_MILE_RPT_LINK WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5) OPEN DB_CURSOR FETCH NEXT FROM DB_CURSOR INTO @ACTION_ID WHILE @@FETCH_STATUS = 0 BEGIN IF EXISTS( SELECT * FROM #ACTION_MILE_RPT_LINK WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5) AND RPT_ID NOT IN (SELECT DISTINCT RPT_ID FROM #TBL) AND ACTION_ID = @ACTION_ID) BEGIN DECLARE @COMPARE TABLE (RPT_ID INT, MILE_ID INT, MILE_STATUS INT) INSERT INTO @COMPARE SELECT RPT_ID, MILE_ID, 5 'MILE_STATUS' FROM #ACTION_MILE_RPT_LINK WHERE MILE_ID IN (SELECT MILE_ID FROM #TBL WHERE MILE_STATUS = 5) AND RPT_ID NOT IN (SELECT DISTINCT RPT_ID FROM #TBL) AND ACTION_ID = @ACTION_ID IF NOT EXISTS( SELECT RPT_ID, MILE_ID, MILE_STATUS FROM #RPT_MILE_MASTER WHERE RPT_ID IN (SELECT RPT_ID FROM @COMPARE) EXCEPT SELECT RPT_ID, MILE_ID, MILE_STATUS FROM @COMPARE) BEGIN UPDATE #ACTION_MASTER SET IS_ACTV = 0 WHERE ACTION_ID = @ACTION_ID END END ELSE BEGIN UPDATE #ACTION_MASTER SET IS_ACTV = 0 WHERE ACTION_ID = @ACTION_ID END FETCH NEXT FROM DB_CURSOR INTO @ACTION_ID END CLOSE DB_CURSOR DEALLOCATE DB_CURSOR --SELECT * FROM #ACTION_MASTER DROP TABLE #ACTION_MASTER DROP TABLE #RPT_MILE_MASTER DROP TABLE #ACTION_MILE_RPT_LINK DROP TABLE #TBL