Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. declare @UserId varchar(20) = '1'
  2. declare @Email varchar(50)= 'blah1'
  3.  
  4. -- set test src tables
  5. DECLARE @src TABLE
  6. (Id int,UserId nvarchar(20),Email nvarchar(50),PostCode int,Country nvarchar(50))
  7.  
  8. -- inset test data
  9. INSERT @src SELECT *
  10. FROM (VALUES
  11. (1, '1', 'blah1', 111, 'au'),
  12. (2, '1', 'blah2', 111, 'au'),
  13. (3, '1', 'blah3', 111, 'au'),
  14. (4, '2', 'blah4', 111, 'au'),
  15. (5, '2', 'blah3', 111, 'nz'),
  16. (6, '4', 'blah4', 111, 'nz'),
  17. (7, '5', 'blah4', 111, 'nz'),
  18. (8, '5', 'blah6', 111, 'nz'),
  19. (9, '7', 'blah7', 111, 'nz'),
  20. (10, '8', 'blah8', 111, 'nz'),
  21. (11, '9', 'blah9', 111, 'nz'),
  22. (12, '10', 'blah10', 111, 'nz'),
  23. (13, '1', 'blah11', 111, 'nz')
  24. ) src (Id, UserId, Email, PostCode, Country)
  25.  
  26. -- show the records, for debug purposes
  27. SELECT *FROM @src
  28.  
  29. -- declare table variables
  30. DECLARE @Ids TABLE (Id int)
  31. DECLARE @Emails TABLE (Email varchar(50),Searched bit)
  32. DECLARE @UserIds TABLE (UserId varchar(20),Searched bit)
  33. DECLARE @Results TABLE (Id int,
  34. UserId varchar(20),
  35. Email varchar(50),
  36. PostCode int,
  37. Country nvarchar(50)
  38. )
  39.  
  40. -- insert Initial UserId
  41. IF (@UserId IS NOT NULL)
  42. INSERT INTO @UserIds (UserId, Searched) VALUES (@UserId, 0);
  43.  
  44. -- insert Initial Email
  45. IF (@Email IS NOT NULL)
  46. INSERT INTO Emails(Email, Searched) VALUES (t.Email, 0);
  47.  
  48. -- while both variables have something in them, there are potentially more matches
  49. WHILE (@UserId IS NOT NULL OR @Email IS NOT NULL)
  50. BEGIN
  51.  
  52. -- clear results
  53. DELETE FROM @Results
  54.  
  55. -- Main search query
  56. INSERT INTO @Results SELECT Id,UserId,Email,PostCode,Country
  57. FROM @src
  58. WHERE (@UserId IS NOT NULL AND userId = @UserId)
  59. OR (@Email IS NOT NULL AND Email = @Email)
  60.  
  61. -- if results are found merge
  62. IF (@@ROWCOUNT > 0)
  63. BEGIN
  64.  
  65. -- merge new ids
  66. MERGE INTO @Ids i
  67. USING (SELECT Id FROM @Results) t ON t.Id = i.Id
  68. WHEN NOT MATCHED THEN
  69. INSERT (Id) VALUES (t.Id);
  70.  
  71. -- merge new userIds
  72. MERGE INTO @UserIds u
  73. USING (SELECT UserId FROM @Results) t ON t.UserId = u.UserId
  74. WHEN NOT MATCHED THEN
  75. INSERT (UserId, Searched) VALUES (t.UserId, 0);
  76.  
  77. -- merge new emails
  78. MERGE INTO @Emails u
  79. USING (SELECT Email FROM @Results) t ON t.Email = u.Email
  80. WHEN NOT MATCHED THEN
  81. INSERT (Email, Searched) VALUES (t.Email, 0);
  82.  
  83. END
  84.  
  85. -- mark variables as searched in thier respective tables
  86. UPDATE @UserIds SET Searched = 1 WHERE UserId = @UserId
  87. UPDATE @Emails SET Searched = 1 WHERE Email = @Email
  88.  
  89. -- clear variables
  90. SET @UserId = NULL;
  91. SET @Email = NULL;
  92.  
  93. -- reset variables to the next unsearched value
  94. SELECT TOP 1 @UserId = UserId
  95. FROM @UserIds
  96. WHERE Searched = 0;
  97.  
  98. SELECT TOP 1 @Email = Email
  99. FROM @Emails
  100. WHERE Searched = 0;
  101.  
  102. END
  103.  
  104. -- display related records
  105. SELECT * FROM @Ids
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement