TSQL Challenge 22 - Solution By Pragnesh Patel



--Pragnesh_Patel_tsqlchallenge_22_v4.sql
--SET STATISTICS IO ON
--SET STATISTICS TIME ON
--
--DBCC DROPCLEANBUFFERS 
--DBCC FREEPROCCACHE

DECLARE @TC22_Result AS TABLE
(
    BoxId INT,
    BallID INT
)

DECLARE @TC22_PendPreferences AS TABLE
(
    BoxId INT,
	BallId INT
)

DECLARE @PendBoxCntr AS INT



SELECT @PendBoxCntr = Count(BoxID) FROM TC22_Boxes

INSERT INTO @TC22_PendPreferences ( BoxID, BallID )
SELECT BoxID, BallID FROM TC22_Preferences

WHILE @PendBoxCntr <> 0

	BEGIN

		INSERT INTO @TC22_Result ( BoxID, BallID )
		SELECT PendPref.BoxID, PendPref.BallID
		FROM @TC22_PendPreferences AS PendPref
		WHERE PendPref.BoxID IN (
									SELECT BoxID
									FROM @TC22_PendPreferences AS PendPref
									GROUP BY BoxID
									HAVING Count(BoxID) = 1
								)

		-- Delete Records from PendPreferences Which are Set
		DELETE FROM @TC22_PendPreferences
		WHERE BoxID IN ( SELECT BoxID FROM @TC22_Result )
			OR BallID IN ( SELECT BallID FROM @TC22_Result )


		INSERT INTO @TC22_Result ( BoxID, BallID )
		SELECT PendPref.BoxID, PendPref.BallID
		FROM @TC22_PendPreferences AS PendPref
		WHERE PendPref.BallID IN (
									SELECT BallID
									FROM @TC22_PendPreferences AS PendPref
									GROUP BY BallID
									HAVING Count(BallID) = 1
								)

		-- Delete Records from PendPreferences Which are Set
		DELETE FROM @TC22_PendPreferences
		WHERE BoxID IN ( SELECT BoxID FROM @TC22_Result )
			OR BallID IN ( SELECT BallID FROM @TC22_Result )


		SELECT @PendBoxCntr = Count(BoxID)
		FROM TC22_Boxes
		WHERE BoxID Not IN ( SELECT BoxID FROM @TC22_Result )

	END


SELECT Box=TC22_Boxes.BoxName, Ball=TC22_Balls.BallName
FROM @TC22_Result AS TC22_Result
	INNER JOIN TC22_Boxes ON TC22_Boxes.BoxID = TC22_Result.BoxID
	INNER JOIN TC22_Balls ON TC22_Balls.BallID = TC22_Result.BallID
ORDER BY TC22_Result.BoxID

Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this solution.