question

Peso avatar image
Peso asked

The ‘SSN matching’ SQL Problem

After we have fixed the performance problems with the codes written by Robert Bar and his brother Reggie Bar, now has the time come to their cousin, Fu Bar.

She was facing a not-so-simple problem by matching a list of user-entered SSN's (from a web page) with a list of validated SSN's. So far so good, right, but as we know, users aren't that particular careful when entering their personal information, so the SSN's have a number of errors in them.
The good thing is that all user-entered SSN's are checksum-validated and have duplicates removed.
All files (setup, sample data population and Fu Bar's code) can be downloaded from here. Fu's code is updated 10am Sunday 16th of May 2010 UTC. If you have downloaded the code before this time, please re-download.

The rules are as follow (in addition to the standard rules here)

1) A perfect match is valid
2) One single digit wrong is valid
3) Two digits wrong are valid, as long as they are not adjacent
4) Three or more digits wrong is invalid
5) If a user-entered SSN has a perfect match with a validated SSN, this user-entered SSN cannot be used in a combination with another validated SSN.
6) You are not allowed to change the schema of the two tables, with indexes as the only exception.

To clarify the non-adjacent rule:
a) A digit wrong in an odd position is allowed with a digit wrong on another odd position.
b) A digit wrong in an even position is allowed with a digit wrong on another even position.
c) A digit wrong in an odd position is not allowed with a digit wrong for any even position. This is because there is one flaw in the checksum algorithm used for the user-entered SSN's.
d) For very same reason as "c)", a digit wrong in an even position is not allowed with a digit wrong for any odd position.

Your task is to rewrite Fu's code (her code takes about 70-75 minutes to run) to produce a list in following style:

vSSN, ueSSN, Status

vSSN is the validated SSN from dbo.Validated table.
ueSSN is the user-entered SSN from the dbo.UserEntered table.
Status column is a tinyint describing how many characters that are wrong. 0 is a perfect match, 1 is one digit wrong match and 2 is a two digit wrong match.

The sorting is vital, because helpdesk will receive this output later for manual correction so an output with order by vSSN, ueSSN and Status is mandatory.

All entries have to be submitted before 9pm Sunday 30th of May 2010 (UTC). Entries will be evaluated as they are submitted and time allows. Final winner will be announced shortly after that.

First Prize for SQL Speed Phreak Challenge #5: $100 and a license for SQL Data Generator (used when creating the sample data) !

There will also be three categorized runner-up prizes:

* Best Cursor-based solution
* Best CLR solution
* Best Unusual/experimental attempt

The winners of these prizes will get a licensed copy of either SQL Prompt or SQL Refactor, whichever they prefer.

Don't forget to have fun and to be creative,

//Peso

Phil Factor:

The SSN problem was one of the most enjoyable to take part in, because the problem as so simple to define, but the answer was tricky to get right. In the end, all the solutions except for cursor-based ones, were performing in under a second, which made the final order rather more difficult to determine.

When differences are in tens of milliseconds, you can get a different order on different machines: This is a problem but when the size of the test data was determined, the existing cursor-based solution was running in fourteen minutes. We never predicted the extent of the Speed Phreakery we could achieve. The first set-based SQL solutions had this down to less than a handful of seconds, and soon the solutions were fighting in around the half-second mark.

The CLR-based solutions probably were at a slight advantage with this problem though it would be nice to see if this is true of different sizes of data. Matt and JAhlen were neck and neck with this, though JAhlen was a node ahead over the finishing line.

Daniel’s SSIS solution was a sober warning that one should never neglect the obvious answers. It gets the award for the Best Unusual/experimental attempt.

Matt was the clear winner of the best SQL solution (OK, Fu Bar was banned from the best Cursor-based solution). I hope he will want the license for Prompt/Refactor, (excellent for quickly formatting code) though he writes his own excellent SQL tools which are well worth a look.

Winner of the First Prize for the SQL Speed Phreak Challenge #5: $100 and a license for SQL Data Generator (used when creating the sample data) was Johan Åhlén (JAhlen).

It was a very difficult decision as to whether Daniel or Johan won since it was a photofinish. We asked various experts, but nobody would venture an opinion. (The actual timings will vary considerably on different servers, be warned. The amount of memory, no. Of CPUs and general machine configuration will make a difference). I almost had to toss a coin!

Kathi Kellenberger, who wrote the excellent http://www.simple-talk.com/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/ Set-based Speed Phreakery: The FIFO Stock Inventory SQL Problem and http://www.simple-talk.com/sql/performance/writing-efficient-sql-set-based-speed-phreakery/ Writing Efficient SQL: Set-Based Speed Phreakery, is studying the results of this competition with the intention of writing it up for Simple-Talk like the others.

Many thanks to all. Peso for all the hard work, and for constructing such an interesting problem. Matt for his energy in coming up with both CLR and TSQL solutions, Scott for kicking things off, Fu Bar for trying her best, Daniel for thinking laterally, Johan for showing the way with the CLR routines, and all those whose comments encouraged the participants to greater efforts.

[1]: http://www.simple-talk.com/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/
t-sqlsql-serverpuzzlespeed-phreakcompetition
9 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Scot Hauder avatar image Scot Hauder commented ·
Hi Peso, My question is with #5. I wanted to confirm that you DO want to allow the inverse of this: basically if a user-entered SSN matches perfectly to a validated SSN this validated SSN can be used with another user-entered SSN. Eg select * from Validated v join UserEntered ue on ue.SSN = v.SSN where v.SSN='545013815' has a perfect match but is also returned by Fu for a user that has entered it incorrectly: 545515815 Thx, have a great weekend
0 Likes 0 ·
Peso avatar image Peso commented ·
It's correct. The vSSN "545013815" has a perfect match with a user-entered SSN "545013815" and as such, the user-entered SSN "545013815" cannot be used for any other match. However, there can be more user-entered SSN's which can match the validated SSN "545013815", and it does with the user-entered SSN "545515815". Also make sure you have downloaded the latest code for Fu. I discovered she didn't comply to all the rules. Shame on her! :-) Fu's code was re-uploaded for an hour ago. //Peso
0 Likes 0 ·
Scot Hauder avatar image Scot Hauder commented ·
Thanks Peso, I think that was it
0 Likes 0 ·
Scot Hauder avatar image Scot Hauder commented ·
I didn't think Fu modified the script that much but it went from 7min to 45min
0 Likes 0 ·
Peso avatar image Peso commented ·
That's the beauty of OR vs AND! :-)
0 Likes 0 ·
Show more comments
Scot Hauder avatar image
Scot Hauder answered

2010.5.16 Scot Hauder v1

I'm titling this one: "Compute Scalar" :)

SELECT val.SSN [vSSN], uen.SSN [ueSSN], 
CASE WHEN SUBSTRING(val.SSN,1,1) = SUBSTRING(uen.SSN,1,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,2,1) = SUBSTRING(uen.SSN,2,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,3,1) = SUBSTRING(uen.SSN,3,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,4,1) = SUBSTRING(uen.SSN,4,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,5,1) = SUBSTRING(uen.SSN,5,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,6,1) = SUBSTRING(uen.SSN,6,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,7,1) = SUBSTRING(uen.SSN,7,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,8,1) = SUBSTRING(uen.SSN,8,1) THEN 0 ELSE 1 END +
CASE WHEN SUBSTRING(val.SSN,9,1) = SUBSTRING(uen.SSN,9,1) THEN 0 ELSE 1 END [Status]

FROM (
  SELECT v.[SSN], x.SSN2
  FROM [dbo].[Validated] v 

  CROSS APPLY (SELECT SUBSTRING(v.SSN,2,1) + SUBSTRING(v.SSN,4,1) + SPACE(2)
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) [SSN2] UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) + SPACE(1) + SUBSTRING(v.SSN,6,1) + SPACE(1) 
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) + SPACE(2) + SUBSTRING(v.SSN,8,1) 
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SPACE(1) + SUBSTRING(v.SSN,4,1) + SUBSTRING(v.SSN,6,1) + SPACE(1) 
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SPACE(1) + SUBSTRING(v.SSN,4,1) + SPACE(1) + SUBSTRING(v.SSN,8,1) 
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SPACE(2) + SUBSTRING(v.SSN,6,1) + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) 
                    + SUBSTRING(v.SSN,3,1)
                    + SUBSTRING(v.SSN,5,1)
                    + SUBSTRING(v.SSN,7,1)
                    + SUBSTRING(v.SSN,9,1) UNION ALL

               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SPACE(2) + SUBSTRING(v.SSN,5,1) + SUBSTRING(v.SSN,7,1) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SPACE(1) + SUBSTRING(v.SSN,3,1) + SPACE(1) + SUBSTRING(v.SSN,7,1) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SPACE(1) + SUBSTRING(v.SSN,3,1) + SUBSTRING(v.SSN,5,1) + SPACE(1) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SPACE(1) + SUBSTRING(v.SSN,3,1) + SUBSTRING(v.SSN,5,1) + SUBSTRING(v.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SPACE(2) + SUBSTRING(v.SSN,7,1) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SPACE(1) + SUBSTRING(v.SSN,5,1) + SPACE(1) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SPACE(1) + SUBSTRING(v.SSN,5,1) + SUBSTRING(v.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SUBSTRING(v.SSN,3,1) + SPACE(2) + SUBSTRING(v.SSN,9,1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SUBSTRING(v.SSN,3,1) + SPACE(1) + SUBSTRING(v.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(v.SSN,2,1) 
                    + SUBSTRING(v.SSN,4,1)
                    + SUBSTRING(v.SSN,6,1)
                    + SUBSTRING(v.SSN,8,1)
                    + SUBSTRING(v.SSN,1,1) + SUBSTRING(v.SSN,3,1) + SUBSTRING(v.SSN,5,1) + SPACE(2))x
  )val
  JOIN
 (SELECT  ue.[SSN], y.SSN2
  FROM [dbo].[UserEntered] ue
  LEFT JOIN [dbo].[Validated] v ON (v.SSN = ue.SSN)
  CROSS APPLY (SELECT SUBSTRING(ue.SSN,2,1) + SUBSTRING(ue.SSN,4,1) + SPACE(2) 
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) [SSN2] UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) + SPACE(1) + SUBSTRING(ue.SSN,6,1) + SPACE(1) 
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) + SPACE(2) + SUBSTRING(ue.SSN,8,1) 
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SPACE(1) + SUBSTRING(ue.SSN,4,1) + SUBSTRING(ue.SSN,6,1) + SPACE(1) 
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SPACE(1) + SUBSTRING(ue.SSN,4,1) + SPACE(1) + SUBSTRING(ue.SSN,8,1) 
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SPACE(2) + SUBSTRING(ue.SSN,6,1) + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) 
                    + SUBSTRING(ue.SSN,3,1)
                    + SUBSTRING(ue.SSN,5,1)
                    + SUBSTRING(ue.SSN,7,1)
                    + SUBSTRING(ue.SSN,9,1) UNION ALL

               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SPACE(2) + SUBSTRING(ue.SSN,5,1) + SUBSTRING(ue.SSN,7,1) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SPACE(1) + SUBSTRING(ue.SSN,3,1) + SPACE(1) + SUBSTRING(ue.SSN,7,1) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SPACE(1) + SUBSTRING(ue.SSN,3,1) + SUBSTRING(ue.SSN,5,1) + SPACE(1) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SPACE(1) + SUBSTRING(ue.SSN,3,1) + SUBSTRING(ue.SSN,5,1) + SUBSTRING(ue.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SPACE(2) + SUBSTRING(ue.SSN,7,1) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SPACE(1) + SUBSTRING(ue.SSN,5,1) + SPACE(1) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SPACE(1) + SUBSTRING(ue.SSN,5,1) + SUBSTRING(ue.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SUBSTRING(ue.SSN,3,1) + SPACE(2) + SUBSTRING(ue.SSN,9,1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SUBSTRING(ue.SSN,3,1) + SPACE(1) + SUBSTRING(ue.SSN,7,1) + SPACE(1) UNION ALL
               SELECT SUBSTRING(ue.SSN,2,1) 
                    + SUBSTRING(ue.SSN,4,1)
                    + SUBSTRING(ue.SSN,6,1)
                    + SUBSTRING(ue.SSN,8,1)
                    + SUBSTRING(ue.SSN,1,1) + SUBSTRING(ue.SSN,3,1) + SUBSTRING(ue.SSN,5,1) + SPACE(2))y
  WHERE v.SSN IS NULL)uen
  ON (val.SSN2 = uen.SSN2)
  GROUP BY Val.SSN,uen.SSN 
  UNION ALL
  SELECT  v.[SSN] , ue.SSN , 0
  FROM [dbo].[Validated] v 
  JOIN [dbo].[UserEntered] ue ON (ue.SSN = v.SSN)
ORDER BY [vSSN], [ueSSN], [status]
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image
Peso answered

Current standing

+-----------------------+-----------+----------+-----------+--------+--------+
| Name                  | Time (ms) | Position |   Reads   | Result |  Type  | 
+-----------------------+-----------+----------+-----------+--------+--------+
| JAhlen v4             |       320 |        1 |       231 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Daniel Ross           |       350 |        2 |       206 | OK     | SSIS   |
+-----------------------+-----------+----------+-----------+--------+--------+
| JAhlen v3             |       370 |          |       231 | Error  | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Matt v2               |       391 |        3 |       231 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Matt v3               |       426 |        4 |       237 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Matt v1               |       538 |        5 |     1 422 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Phil v1e              |       582 |          |     1 994 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Matt v1               |       590 |        6 |       237 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| JAhlen v2             |       652 |        7 |       462 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Phil v1c              |       674 |          |     1 537 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Phil v1b              |       700 |          |     1 609 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Peso v1               |       727 |          |    55 701 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| JAhlen v1             |       776 |        8 |       462 | OK     | SQLCLR |
+-----------------------+-----------+----------+-----------+--------+--------+
| Peso 2                |       819 |          |   154 153 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Steve 1a              |       887 |        9 |    98 500 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Phil v1d              |       934 |          |    98 500 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Matt v2               |       946 |       10 |    55 755 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Phil Factor v1        |     1 900 |          |     5 362 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Scot Hauder v1        |     3 122 |       11 |     2 464 | OK     | T-SQL  |
+-----------------------+-----------+----------+-----------+--------+--------+
| Fu Bar v1             | 4 467 583 |          | 1 484 180 | OK     | CURSOR |
+-----------------------+-----------+----------+-----------+--------+--------+
31 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image Peso commented ·
I think SQLCLR are a great addition to the challenge, but other people can't learn from them as they can with posted T-SQL suggestions. What if we agree to post the source for the SQLCLR to be a valid suggestion?
2 Likes 2 ·
Phil Factor avatar image Phil Factor commented ·
I wonder if we ought to put Foo's timing in!
0 Likes 0 ·
Matt Whitfield avatar image Matt Whitfield ♦♦ commented ·
Peso - are you doing this in the same way as the harness (x runs with cache drops before the first run, and then taking the median timing)
0 Likes 0 ·
Peso avatar image Peso commented ·
Somewhat. I clear the cache and run the solution 10 times and take the minimum values from SQL Profiler.
0 Likes 0 ·
Phil Factor avatar image Phil Factor commented ·
Shouldn't we use Matt's test harness?
0 Likes 0 ·
Show more comments
Phil Factor avatar image
Phil Factor answered

--Phil Factor 1A (I'll call this one the 'remove the hopeless and the obvious User-SSNS before you start'

--build up the DDL
--clear up if it crashed out with an error
if exists (select 1 from tempdb.information_schema.tables 
               where Table_Name like '#ValidSSN%')
    DROP TABLE #validSSN
if exists (select 1 from tempdb.information_schema.tables 
               where Table_Name like '#UserSSN%')
    DROP TABLE #UserSSN
if exists (select 1 from tempdb.information_schema.tables 
               where Table_Name like '#CheckedSSN%')
    DROP TABLE #CheckedSSN

/*we'll go for a temporary table since we need to exclude 
perfect matches from ambiguous matching. We may want to use 
it to remove duplicates if we are doing 'best matching'.*/
CREATE TABLE #CheckedSSN
  (
   vSSN CHAR(9) NOT NULL,
   ueSSN CHAR(9) NOT NULL,
   [Status] TINYINT NOT NULL
  )
--we put odd and even digits in separate strings for valid SSNs
CREATE TABLE #ValidSSN
  (
   Valid_ID INT IDENTITY(1, 1),
   SSN CHAR(9) NOT NULL primary key,
   evens AS (SUBSTRING(SSN, 2, 1)+SUBSTRING(SSN, 4, 1)+SUBSTRING(SSN, 6, 1)
             +SUBSTRING(SSN, 8, 1)) PERSISTED,
   odds AS (SUBSTRING(SSN, 1, 1)+SUBSTRING(SSN, 3, 1)+SUBSTRING(SSN, 5, 1)
            +SUBSTRING(SSN, 7, 1)+SUBSTRING(SSN, 9, 1)) PERSISTED
  )

--we put odd and even digits in separate strings for the ones the users enter
CREATE TABLE #UserSSN
  (
   UserSSN_ID INT IDENTITY(1, 1) primary key,
   SSN CHAR(9) NOT NULL,
   evens AS (SUBSTRING(SSN, 2, 1)+SUBSTRING(SSN, 4, 1)+SUBSTRING(SSN, 6, 1)
             +SUBSTRING(SSN, 8, 1)) PERSISTED,
   odds AS (SUBSTRING(SSN, 1, 1)+SUBSTRING(SSN, 3, 1)+SUBSTRING(SSN, 5, 1)
            +SUBSTRING(SSN, 7, 1)+SUBSTRING(SSN, 9, 1)) PERSISTED
  )

--do some work

--so we can slice up the strings and then index them
INSERT INTO #ValidSSN (SSN)
  SELECT [SSN] FROM Validated 

--we can remove the 0-error matches
INSERT INTO #CheckedSSN (vSSN, ueSSN, Status)
  SELECT Validated.SSN, UserEntered.SSN, 0
  FROM UserEntered
    INNER JOIN Validated
      ON Validated.SSN=UserEntered.SSN

--and we need only waste time on the dud matches
INSERT INTO #UserSSN (SSN)
  SELECT UserEntered.SSN
  FROM UserEntered
    LEFT OUTER JOIN Validated
      ON Validated.SSN=UserEntered.SSN
  WHERE
    Validated.SSN IS NULL--i.e. where we didnt get a match

CREATE INDEX idxValidEvenAndOdd ON #ValidSSN(evens,Odds)
CREATE INDEX idxUsersEvenAndOdd ON #UserSSN(evens,Odds)

--pop in the 1-error matches   where it was an error on the odd side only
INSERT INTO #CheckedSSN (vSSN, ueSSN, Status)
SELECT #ValidSSN.SSN, #UserSSN.SSN, 1 FROM #ValidSSN
    INNER JOIN #UserSSN
    ON #ValidSSN.evens=#UserSSN.evens
WHERE CASE WHEN SUBSTRING(#ValidSSN.odds,1,1)
                 =SUBSTRING(#UserSSN.odds,1,1) THEN 1 ELSE 0 END+    
CASE WHEN SUBSTRING(#ValidSSN.odds,2,1)
                 =SUBSTRING(#UserSSN.odds,2,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,3,1)
                 =SUBSTRING(#UserSSN.odds,3,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,4,1)
                 =SUBSTRING(#UserSSN.odds,4,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,5,1)
                 =SUBSTRING(#UserSSN.odds,5,1) THEN 1 ELSE 0 END
=4
--pop in the 1-error matches   where it was an error on the even side only
INSERT INTO #CheckedSSN (vSSN, ueSSN, Status)
SELECT #ValidSSN.SSN, #UserSSN.SSN, 1 FROM #ValidSSN
    INNER JOIN #UserSSN
    ON #ValidSSN.Odds=#UserSSN.Odds
WHERE CASE WHEN SUBSTRING(#ValidSSN.evens,1,1)
                 =SUBSTRING(#UserSSN.evens,1,1) THEN 1 ELSE 0 END+    
CASE WHEN SUBSTRING(#ValidSSN.evens,2,1)
                 =SUBSTRING(#UserSSN.evens,2,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.evens,3,1)
                 =SUBSTRING(#UserSSN.evens,3,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.evens,4,1)
                 =SUBSTRING(#UserSSN.evens,4,1) THEN 1 ELSE 0 END 
=3   
--pop in the 2-error matches (where no perfect match exists) 
-- it was an error on the odd side only
INSERT INTO #CheckedSSN (vSSN, ueSSN, Status)
SELECT #ValidSSN.SSN, #UserSSN.SSN, 2 FROM #ValidSSN
    INNER JOIN #UserSSN
    ON #ValidSSN.evens=#UserSSN.evens
    left outer join #CheckedSSN on #UserSSN.SSN =#CheckedSSN.ueSSN and status=0
    WHERE CASE WHEN SUBSTRING(#ValidSSN.odds,1,1)
                   =SUBSTRING(#UserSSN.odds,1,1) THEN 1 ELSE 0 END+    
CASE WHEN SUBSTRING(#ValidSSN.odds,2,1)
                  =SUBSTRING(#UserSSN.odds,2,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,3,1)
                  =SUBSTRING(#UserSSN.odds,3,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,4,1)
                  =SUBSTRING(#UserSSN.odds,4,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.odds,5,1)
                  =SUBSTRING(#UserSSN.odds,5,1) THEN 1 ELSE 0 END
=3
and #CheckedSSN.ueSSN is null
--pop in the 2-error matches (where no perfect match exists) 
--where it was an error on the even side only
INSERT INTO #CheckedSSN (vSSN, ueSSN, Status)
SELECT #ValidSSN.SSN, #UserSSN.SSN, 2  FROM #ValidSSN
    INNER JOIN #UserSSN
    ON #ValidSSN.Odds=#UserSSN.Odds
    left outer join #CheckedSSN on #UserSSN.SSN =#CheckedSSN.ueSSN and status=0
--the outer join is to eliminate those that had perfect matched    
WHERE CASE WHEN SUBSTRING(#ValidSSN.evens,1,1)
                   =SUBSTRING(#UserSSN.evens,1,1) THEN 1 ELSE 0 END+    
CASE WHEN SUBSTRING(#ValidSSN.evens,2,1)
                   =SUBSTRING(#UserSSN.evens,2,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.evens,3,1)
                   =SUBSTRING(#UserSSN.evens,3,1) THEN 1 ELSE 0 END+ 
CASE WHEN SUBSTRING(#ValidSSN.evens,4,1)
                   =SUBSTRING(#UserSSN.evens,4,1) THEN 1 ELSE 0 END 
=2   
and #CheckedSSN.ueSSN is null
--print out the results
Select vSSN,
   ueSSN,
   [Status] from #checkedSSN order by vSSN, ueSSN, Status
---clean up
DROP TABLE #validSSN
DROP TABLE #UserSSN
DROP TABLE #CheckedSSN
2 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Scot Hauder avatar image Scot Hauder commented ·
Good job Phil, I also am working on a solution that reduces the number of effective rows acted upon. With only 8K rows returned we should see some sub-second entries soon
0 Likes 0 ·
Phil Factor avatar image Phil Factor commented ·
The trick here is that any SSNs that have any hope of matching must have a complete match on either a string made up of the odd characters, or one of the even characters. You can safely junk the rest. This SQL is over-complicated because I'd wrongly assumed that we were doing a 'best-match' algorithm, and I altered it at the last minute. When I get a moment, I'll tidy it up.
0 Likes 0 ·
JAhlen avatar image
JAhlen answered

I call this the pure SQL CLR solution... J

select * from dbo.match()

Oh, by the way you need to add the SQL CLR assembly first...

CREATE ASSEMBLY [SSNMatch]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103008E81F24B0000000000000000E00002210B010800001800000006000000000000EE3700000020000000400000000040000020000000020000040000000000000004000000000000000080000000020000000000000300408500001000001000000000100000100000000000001000000000000000000000009C3700004F000000004000008003000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000F4170000002000000018000000020000000000000000000000000000200000602E72737263000000800300000040000000040000001A0000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001E00000000000000000000000000004000004200000000000000000000000000000000D03700000000000048000000020005001C290000800E000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B30040053050000010000117201000070730F00000A130411046F1000000A72310000701104731100000A130511056F1200000AA518000001130611068D180000010A1106731300000A0C1106731300000A0BDE0C11052C0711056F1400000ADC72770000701104731100000A130711076F1200000AA518000001130811088D180000010DDE0C11072C0711076F1400000ADC72C10000701104731100000A130911096F1500000A130A16130B389E000000110A166F1600000A741E000001281700000A130C06110B110C9E110C2804000006130D110C2805000006130E07110D6F1800000A2C1107110D6F1900000A110B6F1A00000A2B1B1C731B00000A130F110F110B6F1A00000A07110D110F6F1C00000A08110E6F1800000A2C1108110E6F1900000A110B6F1A00000A2B1B1C731B00000A13101110110B6F1A00000A08110E11106F1C00000A110B1758130B110A6F1D00000A3A56FFFFFFDE0C110A2C07110A6F1400000ADCDE0C11092C0711096F1400000ADC72010100701104731100000A131111116F1500000A13121613132B1B09111325175813131112166F1600000A741E000001281700000A9E11126F1D00000A2DDCDE0C11122C0711126F1400000ADCDE0C11112C0711116F1400000ADCDE0C11042C0711046F1400000ADC2000CA9A3B731E00000A13140613271613282B171127112894131511141115176F1F00000A112817581328112811278E6932E120A0860100731E00000A1316086F2000000A6F2100000A13292B1311296F2200000A131711161117176F1F00000A11296F2300000A2DE4DE0C11292C0711296F1400000ADC20A0860100731E00000A1318076F2000000A6F2100000A132A2B13112A6F2200000A131911181119176F1F00000A112A6F2300000A2DE4DE0C112A2C07112A6F1400000ADC098E69732400000A131A09132B16132C3898020000112B112C94131B1114111B6F2500000A2C43111A730900000613261126121B7245010070282600000A7D010000041126121B7245010070282600000A7D020000041126167D0300000411266F2700000A383D020000111B2804000006131C111B2805000006131D1118111C6F2500000A39F600000007111C6F1900000A6F2800000A132D38C6000000122D282900000A131E06111E94131F111F1F0A5B1F0A5D111D1F0A5D3303162B011713201120111F20E80300005B1F0A5D111D1F0A5B1F0A5D3303162B01175813201120111F20A08601005B1F0A5D111D1F645B1F0A5D3303162B01175813201120111F20809698005B1F0A5D111D20E80300005B1F0A5D3303162B01175813201120183040111A730900000613211121121F7245010070282600000A7D010000041121121B7245010070282600000A7D0200000411211120D27D0300000411216F2700000A122D282A00000A3A2EFFFFFFDE0E122DFE160600001B6F1400000ADC1116111D6F2500000A391901000008111D6F1900000A6F2800000A132E38E9000000122E282900000A1322061122941323112328040000062611231F0A5D111C1F0A5D3303162B01171324112411231F645B1F0A5D111C1F0A5B1F0A5D3303162B01175813241124112320102700005B1F0A5D111C1F645B1F0A5D3303162B0117581324112411232040420F005B1F0A5D111C20E80300005B1F0A5D3303162B0117581324112411232000E1F5055B1F0A5D111C20102700005B1F0A5D3303162B01175813241124183040111A73090000061325112512237245010070282600000A7D010000041125121B7245010070282600000A7D0200000411251124D27D0300000411256F2700000A122E282A00000A3A0BFFFFFFDE0E122EFE160600001B6F1400000ADC112C1758132C112C112B8E693F5DFDFFFF111A6F2B00000A2A00410C0100020000002100000028000000490000000C000000000000000200000063000000180000007B0000000C00000000000000020000009E000000B4000000520100000C000000000000000200000095000000CB000000600100000C0000000000000002000000830100002B000000AE0100000C00000000000000020000007A01000042000000BC0100000C00000000000000020000000C000000BE010000CA0100000C00000000000000020000002202000020000000420200000C00000000000000020000006702000020000000870200000C00000000000000020000002C030000D9000000050400000E000000000000000200000030040000FC0000002C0500000E00000000000000133004006800000002000011160A028E6917590B2B4C03020694596C020794020694596C5B0D060706596C095A23000000000000E03F5869580C0816320608028E692626020894033302082A0208940331060817590B2B0A020894032F040817580A06072F0C020694033006020794032FA4152A133003006000000003000011160A028E6917590B2B44060706596C23000000000000E03F5A23000000000000E03F5869580C0816320608028E692626020894033302082A0208940331060817590B2B0A020894032F040817580A06072F0C020694033006020794032FAC152A033003004000000000000000021F0A5D021F645B1F0A5D1F0A5A580220102700005B1F0A5D1F645A58022040420F005B1F0A5D20E80300005A58022000E1F5055B1F0A5D20102700005A582AD6021F0A5B1F0A5D0220E80300005B1F0A5D1F0A5A580220A08601005B1F0A5D1F645A580220809698005B1F0A5D20E80300005A582A0000010000000A00000064000000E803000010270000A086010040420F008096980000E1F50513300400700000000400001120A0860100731E00000A0A1F098D1800000125D004000004282D00000A0B160C2B48170D2B3B08175813042B2B1713052B1A06070894095A0711049411055A58176F1F00000A11051758130511051F0931E011041758130411041B32D00917580D091F0931C00817580C081B32B4062A133003003D000000050000110274030000020A03067B01000004282E00000A732F00000A5104067B02000004282E00000A732F00000A5105067B03000004283000000A81050000012A1E02283100000A2A1E02283100000A2A00000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000060040000237E0000CC0400005805000023537472696E677300000000240A00005001000023555300740B0000100000002347554944000000840B0000FC02000023426C6F620000000000000002000001579502280902000000FA253300160000010000002A0000000500000004000000090000000A000000310000000C0000000100000005000000060000000100000001000000030000000200000000000A00010000000000060046003F00060060004D00060091004D000A00C800B3000A00D100B30006002801090106004701350106005E01350106007B01350106009A0135010600B30135010600CC0135010600E701350106000202350106001B02090106002F0235010600680248020600880248020A00CA02AF020A00F502DF020A00160303030A002803DF020A003303030306004B033F000E006C035103060079035103060080033F000A009403DF020A00B00303030600C6033F000600CD033F000600F603510306000704510306001504510306003D044D006B005B0400000600B30448020600CE043F00060009054802060018053F0006001E053F000A004105B30000000000010000000000010001000100100017000000050001000100050010002C000000050001000900000000006E040000050004000A0013010000D8040000990005000A000600E40032000600E90032000600EF0035001301F5045E0250200000000096006C000A000100BC2600000000910072000F00010030270000000091007A000F0003009C27000000009100820016000500E8270000000091008A001600060044280000000091009A001B000700C028000000009600D900200007000929000000008618DE002E000B001129000000008618DE002E000B0000000100F60000000200FA0000000100F60000000200FA0000000100FE0000000100FE0000000100020102000200E40002000300E90002000400EF003100DE002E003900DE0038004100DE0038004900DE0038005100DE0038005900DE0038006100DE0038006900DE0038007100DE0038007900DE003D008100DE0038008900DE0042009100DE002E009900DE002E00A100DE003800A90023032E00B100DE003701B9003D033E010C00DE004200D9008C032E00B100A2034D01E900BD035201F900D50357010C00DD035C010C00BD0362011400E9036F011400DE0042000C00E9037501E900ED037D011900DE0042001900F20381010C00FE0387011C002304980124003104A901190149047D012C00DE0042001900BD03B501C1005204BA012C00E9036F0114002304BF0134003104A901340049047D012C006604D0012901DE002E0039013105620251014B0577022100DE007E0229004B0585020900DE002E002000730047002E002B00A4022E00130090022E001B009E022E0023009E022E0043009E022E006B00DD022E003B00B3022E00330090022E0053009E022E006300D4028300630159020100240000000500D6014C0253026C028B02420169019101A201AE01C9012028000004000480000001000000CE0E8F5B000000000000A602000002000000000000000000000001003600000000000200000000000000000000000100A7000000000002000000000000000000000001003F000000000003000200050004000000003C4D6F64756C653E0053534E4D617463682E646C6C0055736572446566696E656446756E6374696F6E7300526573756C74526F77006D73636F726C69620053797374656D004F626A6563740053797374656D2E436F6C6C656374696F6E730049456E756D657261626C65004D6174636800465365617263680042536561726368004765744576656E004765744F646400426974417272617900416C6C6F77656444696666730053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C43686172730053716C42797465004E657874002E63746F72007653534E00756553534E00537461747573006172720073736E006E756D006F626A526F770053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053534E4D61746368004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E4174747269627574650053797374656D2E446174612E53716C436C69656E740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E64004462436F6D6D616E6400457865637574655363616C617200496E7433320053797374656D2E436F6C6C656374696F6E732E47656E6572696300536F727465644C6973746032004C69737460310049446973706F7361626C6500446973706F73650053716C44617461526561646572004578656375746552656164657200446244617461526561646572006765745F4974656D00537472696E6700436F6E7665727400546F496E74333200436F6E7461696E734B65790041646400526561640053657400494C6973746031006765745F4B6579730049456E756D657261626C6560310049456E756D657261746F72603100476574456E756D657261746F72006765745F43757272656E740049456E756D657261746F72004D6F76654E65787400546F537472696E6700456E756D657261746F7200546F4172726179003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B39454630363145462D453334352D343442342D414431452D3635304637383231393645457D00436F6D70696C657247656E6572617465644174747269627574650056616C756554797065005F5F5374617469634172726179496E69745479706553697A653D33360024246D6574686F643078363030303030362D310052756E74696D6548656C706572730041727261790052756E74696D654669656C6448616E646C6500496E697469616C697A6541727261790053716C537472696E67006F705F496D706C696369740000002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D0074007200750065000045530045004C00450043005400200043004F0055004E00540028002A0029002000460052004F004D002000640062006F002E00560061006C006900640061007400650064000049530045004C00450043005400200043004F0055004E00540028002A0029002000460052004F004D002000640062006F002E00550073006500720045006E0074006500720065006400003F530045004C0045004300540020005B00530053004E005D002000460052004F004D002000640062006F002E00560061006C006900640061007400650064000043530045004C0045004300540020005B00530053004E005D002000460052004F004D002000640062006F002E00550073006500720045006E0074006500720065006400000764003000390000000000EF61F09E45E3B444AD1E650F782196EE0008B77A5C561934E0890400001209060002081D08080400010808040000120D0D0004011C1012111012111011150320000102060E020605042001010E0420010102042001010880EE010003005455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A4461746141636365737301000000540E0F5461626C65446566696E6974696F6E335B7653534E5D206E636861722839292C205B756553534E5D206E636861722839292C205B5374617475735D2074696E79696E74540E1146696C6C526F774D6574686F644E616D65044E657874062002010E12510320001C0A1512650208151269010804200012710420011C08040001080E052001021300062001130113000515126901080520010113000720020113001301032000020520020108020920001512808101130006151280850108092000151280890113000615128089010804200013000615126901120C04200102080420010E0E09200015118091011300061511809101080520001D130075072F1D0815126502081512690108151265020815126901081D0812511259081259081259127108080808151269010815126901081259127108120D08120D08120D0815126901120C080808080808120C080808120C120C1D08081512808901081512808901081D08081511809101081511809101080607040808080D050703080808040100000003061114090002011280A11180A50A0706120D1D08080808080600011180A90E062001011180A9050001111505040701120C0D01000853534E4D6174636800000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230313000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301C43700000000000000000000DE370000002000000000000000000000000000000000000000000000D0370000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020400000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000280300000000000000000000280334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001008F5BCE0E000001008F5BCE0E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00488020000010053007400720069006E006700460069006C00650049006E0066006F00000064020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F006600740000003C0009000100460069006C0065004400650073006300720069007000740069006F006E0000000000530053004E004D0061007400630068000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003700390030002E0032003300340033003900000000003C000D00010049006E007400650072006E0061006C004E0061006D0065000000530053004E004D0061007400630068002E0064006C006C00000000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F0066007400200032003000310030000000000044000D0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530053004E004D0061007400630068002E0064006C006C0000000000340009000100500072006F0064007500630074004E0061006D00650000000000530053004E004D0061007400630068000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003700390030002E00320033003400330039000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003700390030002E0032003300340033003900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000F03700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE

GO

CREATE FUNCTION [dbo].[Match]()
RETURNS  TABLE (
    [vSSN] [nchar](9) NULL,
    [ueSSN] [nchar](9) NULL,
    [Status] [tinyint] NULL
) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SSNMatch].[UserDefinedFunctions].[Match]
GO
7 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image Peso commented ·
Vad kul att se dig här!
0 Likes 0 ·
Peso avatar image Peso commented ·
And for you non-swedish speakers; "Great to see you here!".
0 Likes 0 ·
Peso avatar image Peso commented ·
I get this error message trying to run the SQLCLR. "Msg 6532, Level 16, State 49, Line 1 .NET Framework execution was aborted by escalation policy because of out of memory. System.Threading.ThreadAbortException: Thread was being aborted. System.Threading.ThreadAbortException: at System.Collections.BitArray..ctor(Int32 length, Boolean defaultValue) at UserDefinedFunctions.Match()"
0 Likes 0 ·
Phil Factor avatar image Phil Factor commented ·
Om inte någon annan skriver ett snabbare CLR lösning, är du dömd att få pris för bästa CLR-baserad lösning. Välkommen till tävlingen, och tack för att komma in.
0 Likes 0 ·
JAhlen avatar image JAhlen commented ·
Thanks. My SQL CLR solution works on my laptop (64-bit SQL Server 2008 R2 RTM with default settings) and takes approx 2 300 ms. If necessary I can make some changes so it takes less memory (but will be a bit slower).
0 Likes 0 ·
Show more comments
JAhlen avatar image
JAhlen answered

New version (more memory conservative, but slower). I call this the pure SQL CLR solution 2... J

select * from dbo.match()

Code for the SQL CLR assembly...

CREATE ASSEMBLY [SSNMatch]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01030030E8F24B0000000000000000E00002210B010800001800000006000000000000BE3700000020000000400000000040000020000000020000040000000000000004000000000000000080000000020000000000000300408500001000001000000000100000100000000000001000000000000000000000006837000053000000004000008003000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000C4170000002000000018000000020000000000000000000000000000200000602E72737263000000800300000040000000040000001A0000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001E00000000000000000000000000004000004200000000000000000000000000000000A0370000000000004800000002000500EC2800007C0E000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B30040020050000010000117201000070730F00000A130411046F1000000A72310000701104731100000A130511056F1200000AA518000001130611068D180000010A1106731300000A0C1106731300000A0BDE0C11052C0711056F1400000ADC72770000701104731100000A130711076F1200000AA518000001130811088D180000010DDE0C11072C0711076F1400000ADC72C10000701104731100000A130911096F1500000A130A16130B389E000000110A166F1600000A741E000001281700000A130C06110B110C9E110C2804000006130D110C2805000006130E07110D6F1800000A2C1107110D6F1900000A110B6F1A00000A2B1B1C731B00000A130F110F110B6F1A00000A07110D110F6F1C00000A08110E6F1800000A2C1108110E6F1900000A110B6F1A00000A2B1B1C731B00000A13101110110B6F1A00000A08110E11106F1C00000A110B1758130B110A6F1D00000A3A56FFFFFFDE0C110A2C07110A6F1400000ADCDE0C11092C0711096F1400000ADC72010100701104731100000A131111116F1500000A13121613132B1B09111325175813131112166F1600000A741E000001281700000A9E11126F1D00000A2DDCDE0C11122C0711126F1400000ADCDE0C11112C0711116F1400000ADCDE0C11042C0711046F1400000ADC20A0860100731E00000A1314086F1F00000A6F2000000A13252B1311256F2100000A131511141115176F2200000A11256F2300000A2DE4DE0C11252C0711256F1400000ADC20A0860100731E00000A1316076F1F00000A6F2000000A13262B1311266F2100000A131711161117176F2200000A11266F2300000A2DE4DE0C11262C0711266F1400000ADC098E69732400000A13180913271613283898020000112711289413190611192802000006152E43111873090000061324112412197245010070282500000A7D01000004112412197245010070282500000A7D020000041124167D0300000411246F2600000A383D02000011192804000006131A11192805000006131B1116111A6F2700000A39F600000007111A6F1900000A6F2800000A132938C60000001229282900000A131C06111C94131D111D1F0A5B1F0A5D111B1F0A5D3303162B0117131E111E111D20E80300005B1F0A5D111B1F0A5B1F0A5D3303162B011758131E111E111D20A08601005B1F0A5D111B1F645B1F0A5D3303162B011758131E111E111D20809698005B1F0A5D111B20E80300005B1F0A5D3303162B011758131E111E18304011187309000006131F111F121D7245010070282500000A7D01000004111F12197245010070282500000A7D02000004111F111ED27D03000004111F6F2600000A1229282A00000A3A2EFFFFFFDE0E1229FE160600001B6F1400000ADC1114111B6F2700000A391901000008111B6F1900000A6F2800000A132A38E9000000122A282900000A1320061120941321112128040000062611211F0A5D111A1F0A5D3303162B01171322112211211F645B1F0A5D111A1F0A5B1F0A5D3303162B01175813221122112120102700005B1F0A5D111A1F645B1F0A5D3303162B0117581322112211212040420F005B1F0A5D111A20E80300005B1F0A5D3303162B0117581322112211212000E1F5055B1F0A5D111A20102700005B1F0A5D3303162B01175813221122183040111873090000061323112312217245010070282500000A7D01000004112312197245010070282500000A7D0200000411231122D27D0300000411236F2600000A122A282A00000A3A0BFFFFFFDE0E122AFE160600001B6F1400000ADC112817581328112811278E693F5DFDFFFF11186F2B00000A2A410C0100020000002100000028000000490000000C000000000000000200000063000000180000007B0000000C00000000000000020000009E000000B4000000520100000C000000000000000200000095000000CB000000600100000C0000000000000002000000830100002B000000AE0100000C00000000000000020000007A01000042000000BC0100000C00000000000000020000000C000000BE010000CA0100000C0000000000000002000000EF010000200000000F0200000C00000000000000020000003402000020000000540200000C0000000000000002000000F9020000D9000000D20300000E0000000000000002000000FD030000FC000000F90400000E00000000000000133004006800000002000011160A028E6917590B2B4C03020694596C020794020694596C5B0D060706596C095A23000000000000E03F5869580C0816320608028E692626020894033302082A0208940331060817590B2B0A020894032F040817580A06072F0C020694033006020794032FA4152A133003006000000003000011160A028E6917590B2B44060706596C23000000000000E03F5A23000000000000E03F5869580C0816320608028E692626020894033302082A0208940331060817590B2B0A020894032F040817580A06072F0C020694033006020794032FAC152A033003004000000000000000021F0A5D021F645B1F0A5D1F0A5A580220102700005B1F0A5D1F645A58022040420F005B1F0A5D20E80300005A58022000E1F5055B1F0A5D20102700005A582AD6021F0A5B1F0A5D0220E80300005B1F0A5D1F0A5A580220A08601005B1F0A5D1F645A580220809698005B1F0A5D20E80300005A582A000000000000010000000A00000064000000E803000010270000A086010040420F008096980000E1F50513300400700000000400001120A0860100731E00000A0A1F098D1800000125D004000004282D00000A0B160C2B48170D2B3B08175813042B2B1713052B1A06070894095A0711049411055A58176F2200000A11051758130511051F0931E011041758130411041B32D00917580D091F0931C00817580C081B32B4062A133003003D000000050000110274030000020A03067B01000004282E00000A732F00000A5104067B02000004282E00000A732F00000A5105067B03000004283000000A81050000012A1E02283100000A2A1E02283100000A2A00000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000060040000237E0000CC0400005805000023537472696E677300000000240A00005001000023555300740B0000100000002347554944000000840B0000F802000023426C6F620000000000000002000001579502280902000000FA253300160000010000002A0000000500000004000000090000000A000000310000000C0000000100000005000000060000000100000001000000030000000200000000000A00010000000000060046003F00060060004D00060091004D000A00C800B3000A00D100B30006002801090106004701350106005E01350106007B01350106009A0135010600B30135010600CC0135010600E701350106000202350106001B02090106002F0235010600680248020600880248020A00CA02AF020A00F502DF020A00160303030A002803DF020A003303030306004B033F000E006C035103060079035103060080033F000A009403DF020A00B00303030600C6033F000600CD033F000600F203510306000304510306001104510306003D044D006B005B0400000600B30448020600CE043F00060009054802060018053F0006001E053F000A004105B30000000000010000000000010001000100100017000000050001000100050010002C000000050001000900000000006E040000050004000A0013010000D8040000990005000A000600E40032000600E90032000600EF0035001301F504580250200000000096006C000A000100882600000000910072000F000100FC260000000091007A000F0003006827000000009100820016000500B4270000000091008A001600060014280000000091009A001B0007009028000000009600D90020000700D928000000008618DE002E000B00E128000000008618DE002E000B0000000100F60000000200FA0000000100F60000000200FA0000000100FE0000000100FE0000000100020102000200E40002000300E90002000400EF003100DE002E003900DE0038004100DE0038004900DE0038005100DE0038005900DE0038006100DE0038006900DE0038007100DE0038007900DE003D008100DE0038008900DE0042009100DE002E009900DE002E00A100DE003800A90023032E00B100DE003701B9003D033E010C00DE004200D9008C032E00B100A2034D01E900BD035201F900D50357010C00DD035C010C00BD0362011400E9036F011400DE0042000C00E9037501E900ED037D011900DE0042000C00FA0381011C001F04920124002D04A30119003904A801190149047D012C00DE004200C1005204B5012C00E9036F011900BD03BA0114001F04BF0134002D04A301340049047D012C006604D0012901DE002E00390131055C0251014B0571022100DE00780229004B057F020900DE002E002000730047002E002B009E022E0013008A022E001B0098022E00230098022E00430098022E006B00D7022E003B00AD022E0033008A022E00530098022E006300CE028300630153020100240000000500D60146024D0266028502420169018B019C01AE01C901F027000004000480000001000000CE0EE08E000000000000A602000002000000000000000000000001003600000000000200000000000000000000000100A7000000000002000000000000000000000001003F000000000003000200050004000000003C4D6F64756C653E0053534E4D617463682E646C6C0055736572446566696E656446756E6374696F6E7300526573756C74526F77006D73636F726C69620053797374656D004F626A6563740053797374656D2E436F6C6C656374696F6E730049456E756D657261626C65004D6174636800465365617263680042536561726368004765744576656E004765744F646400426974417272617900416C6C6F77656444696666730053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C43686172730053716C42797465004E657874002E63746F72007653534E00756553534E00537461747573006172720073736E006E756D006F626A526F770053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C7475726541747472696275746500436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053534E4D61746368004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E4174747269627574650053797374656D2E446174612E53716C436C69656E740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E64004462436F6D6D616E6400457865637574655363616C617200496E7433320053797374656D2E436F6C6C656374696F6E732E47656E6572696300536F727465644C6973746032004C69737460310049446973706F7361626C6500446973706F73650053716C44617461526561646572004578656375746552656164657200446244617461526561646572006765745F4974656D00537472696E6700436F6E7665727400546F496E74333200436F6E7461696E734B657900416464005265616400494C6973746031006765745F4B6579730049456E756D657261626C6560310049456E756D657261746F72603100476574456E756D657261746F72006765745F43757272656E74005365740049456E756D657261746F72004D6F76654E65787400546F537472696E6700456E756D657261746F7200546F4172726179003C50726976617465496D706C656D656E746174696F6E44657461696C733E7B46394443393744462D324146382D344135462D394144382D3836384530354646323137467D00436F6D70696C657247656E6572617465644174747269627574650056616C756554797065005F5F5374617469634172726179496E69745479706553697A653D33360024246D6574686F643078363030303030362D310052756E74696D6548656C706572730041727261790052756E74696D654669656C6448616E646C6500496E697469616C697A6541727261790053716C537472696E67006F705F496D706C696369740000002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D0074007200750065000045530045004C00450043005400200043004F0055004E00540028002A0029002000460052004F004D002000640062006F002E00560061006C006900640061007400650064000049530045004C00450043005400200043004F0055004E00540028002A0029002000460052004F004D002000640062006F002E00550073006500720045006E0074006500720065006400003F530045004C0045004300540020005B00530053004E005D002000460052004F004D002000640062006F002E00560061006C006900640061007400650064000043530045004C0045004300540020005B00530053004E005D002000460052004F004D002000640062006F002E00550073006500720045006E0074006500720065006400000764003000390000000000DF97DCF9F82A5F4A9AD8868E05FF217F0008B77A5C561934E0890400001209060002081D08080400010808040000120D0D0004011C1012111012111011150320000102060E020605042001010E0420010102042001010880EE010003005455794D6963726F736F66742E53716C5365727665722E5365727665722E446174614163636573734B696E642C2053797374656D2E446174612C2056657273696F6E3D322E302E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D623737613563353631393334653038390A4461746141636365737301000000540E0F5461626C65446566696E6974696F6E335B7653534E5D206E636861722839292C205B756553534E5D206E636861722839292C205B5374617475735D2074696E79696E74540E1146696C6C526F774D6574686F644E616D65044E657874062002010E12510320001C0A1512650208151269010804200012710420011C08040001080E052001021300062001130113000515126901080520010113000720020113001301032000020920001512808101130006151280850108092000151280890113000615128089010804200013000520020108020615126901120C0420010E0E042001020809200015118091011300061511809101080520001D13006F072B1D0815126502081512690108151265020815126901081D0812511259081259081259127108080808151269010815126901081259127108120D08120D0815126901120C080808080808120C080808120C120C1512808901081512808901081D08081511809101081511809101080607040808080D050703080808040100000003061114090002011280A11180A50A0706120D1D08080808080600011180A90E062001011180A9050001111505040701120C0D01000853534E4D6174636800000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230313000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000903700000000000000000000AE370000002000000000000000000000000000000000000000000000A037000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000280300000000000000000000280334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE0000010000000100E08ECE0E00000100E08ECE0E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00488020000010053007400720069006E006700460069006C00650049006E0066006F00000064020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F006600740000003C0009000100460069006C0065004400650073006300720069007000740069006F006E0000000000530053004E004D0061007400630068000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003700390030002E0033003600350037003600000000003C000D00010049006E007400650072006E0061006C004E0061006D0065000000530053004E004D0061007400630068002E0064006C006C00000000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F0066007400200032003000310030000000000044000D0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530053004E004D0061007400630068002E0064006C006C0000000000340009000100500072006F0064007500630074004E0061006D00650000000000530053004E004D0061007400630068000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003700390030002E00330036003500370036000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003700390030002E0033003600350037003600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000C03700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE

GO

CREATE FUNCTION [dbo].[Match]()
RETURNS  TABLE (
    [vSSN] [nchar](9) NULL,
    [ueSSN] [nchar](9) NULL,
    [Status] [tinyint] NULL
) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SSNMatch].[UserDefinedFunctions].[Match]
GO
1 comment
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image Peso commented ·
This is 100 ms faster than v1.
0 Likes 0 ·
Matt Whitfield avatar image
Matt Whitfield answered

Matt v1

Titled the 'This probably really won't scale very well, but it's fast for the given data' version

DECLARE @UserEnteredTmp TABLE (
    [u1] [tinyint] NOT NULL, [u2] [tinyint] NOT NULL, [u3] [tinyint] NOT NULL, [u4] [tinyint] NOT NULL, [u5] [tinyint] NOT NULL,
    [u6] [tinyint] NOT NULL, [u7] [tinyint] NOT NULL, [u8] [tinyint] NOT NULL, [u9] [tinyint] NOT NULL, [odds] [int] NOT NULL,
    [evens] [smallint] NOT NULL, [ssn] [char] (9) )
DECLARE @ValidatedTmp TABLE (
    [u1] [tinyint] NOT NULL, [u2] [tinyint] NOT NULL, [u3] [tinyint] NOT NULL, [u4] [tinyint] NOT NULL, [u5] [tinyint] NOT NULL,
    [u6] [tinyint] NOT NULL, [u7] [tinyint] NOT NULL, [u8] [tinyint] NOT NULL, [u9] [tinyint] NOT NULL, [odds] [int] NOT NULL,
    [evens] [smallint] NOT NULL, [ssn] [char] (9) )

INSERT INTO @UserEnteredTmp ([u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [odds], [evens], [ssn])
SELECT [u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [u1] + [u3] + [u5] + [u7] + [u9], [u2] + [u4] + [u6] + [u8], [SSN] FROM 
(
       SELECT SUBSTRING(SSN, 1, 1) AS u1, SUBSTRING(SSN, 2, 1) AS u2, SUBSTRING(SSN, 3, 1) AS u3, SUBSTRING(SSN, 4, 1) AS u4,
              SUBSTRING(SSN, 5, 1) AS u5, SUBSTRING(SSN, 6, 1) AS u6, SUBSTRING(SSN, 7, 1) AS u7, SUBSTRING(SSN, 8, 1) AS u8,
              SUBSTRING(SSN, 9, 1) AS u9, [SSN]
       FROM  (SELECT [SSN] AS SSN 
                FROM [dbo].[UserEntered] 
               WHERE [SSN] NOT IN 
                    (SELECT [SSN] 
                       FROM [dbo].[Validated])
              ) idat
) odat

INSERT INTO @ValidatedTmp ([u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [odds], [evens], [ssn])
SELECT [u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [u1] + [u3] + [u5] + [u7] + [u9], [u2] + [u4] + [u6] + [u8], [ssn] FROM 
(
       SELECT SUBSTRING(SSN, 1, 1) AS u1, SUBSTRING(SSN, 2, 1) AS u2, SUBSTRING(SSN, 3, 1) AS u3, SUBSTRING(SSN, 4, 1) AS u4,
              SUBSTRING(SSN, 5, 1) AS u5, SUBSTRING(SSN, 6, 1) AS u6, SUBSTRING(SSN, 7, 1) AS u7, SUBSTRING(SSN, 8, 1) AS u8,
              SUBSTRING(SSN, 9, 1) AS u9, [SSN]
         FROM [dbo].[Validated]
) odat

SELECT   [vSSN], [ueSSN], [Status]
FROM     (SELECT [SSN] AS ueSSN, [SSN] AS vSSN, 0 AS [Status]
          FROM   (SELECT [dbo].[UserEntered].[SSN] AS SSN
                  FROM   [dbo].[UserEntered]
                  WHERE  [SSN] IN (SELECT [SSN]
                                   FROM   [dbo].[Validated])) AS idat
          UNION ALL
          SELECT [ueSSN], [vSSN], [Status]
          FROM   (SELECT [UserEnteredTmp].[ssn] AS ueSSN, [ValidatedTmp].[ssn] AS vSSN,
                         CASE WHEN [ValidatedTmp].[u2] = [UserEnteredTmp].[u2] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u4] = [UserEnteredTmp].[u4] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u6] = [UserEnteredTmp].[u6] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u8] = [UserEnteredTmp].[u8] THEN 0 ELSE 1 END AS [Status]
                  FROM   @UserEnteredTmp AS UserEnteredTmp INNER JOIN
                         @ValidatedTmp AS ValidatedTmp ON [UserEnteredTmp].[odds] = [ValidatedTmp].[odds]) AS idat
          WHERE  [Status] < 3
          UNION ALL
          SELECT [ueSSN], [vSSN], [Status]
          FROM   (SELECT [UserEnteredTmp].[ssn] AS ueSSN, [ValidatedTmp].[ssn] AS vSSN,
                         CASE WHEN [ValidatedTmp].[u1] = [UserEnteredTmp].[u1] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u3] = [UserEnteredTmp].[u3] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u5] = [UserEnteredTmp].[u5] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u7] = [UserEnteredTmp].[u7] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u9] = [UserEnteredTmp].[u9] THEN 0 ELSE 1 END AS [Status]
                  FROM   @UserEnteredTmp AS UserEnteredTmp INNER JOIN
                         @ValidatedTmp AS ValidatedTmp ON [UserEnteredTmp].[evens] = [ValidatedTmp].[evens]) AS idat
          WHERE  [Status] < 3
         ) AS idd
ORDER BY [vSSN], [ueSSN], [Status];
3 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image Peso commented ·
I'll try this after I run Fu's code again to get read count.
0 Likes 0 ·
Matt Whitfield avatar image Matt Whitfield ♦♦ commented ·
... and get some sleep while it's running! :)
0 Likes 0 ·
Matt Whitfield avatar image Matt Whitfield ♦♦ commented ·
... Just updated the order by clause
0 Likes 0 ·
Matt Whitfield avatar image
Matt Whitfield answered

Matt CLR v1

The 'it was going to happen' edition

CREATE ASSEMBLY [Challenge5]
AUTHORIZATION [dbo]
FROM
0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103002C1DF34B0000000000000000E00002210B0108000016000000060000000000001E350000002000000040000000004000002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000D03400004B000000004000004803000000000000000000000000000000000000006000000C000000503400001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000024150000002000000016000000020000000000000000000000000000200000602E7273726300000048030000004000000004000000180000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001C0000000000000000000000000000400000420000000000000000000000000000000000350000000000004800000002000500A0270000B00C000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B300700E00300000100001100730F00000A0A730F00000A0B731000000A0C731100000A0D7201000070731200000A13040011046F1300000A0072310000701104731400000A13050011056F1500000A13060038910000000012071106166F1600000A2803000006000612077B0300000412086F1700000A131211122D1900731800000A13080612077B0300000411086F1900000A0000110811076F1A00000A000712077B0400000412096F1700000A131211122D1900731800000A13090712077B0400000411096F1900000A0000110911076F1A00000A000812077B02000004146F1B00000A000011066F1C00000A131211123A5FFFFFFF00DE14110614FE01131211122D0811066F1D00000A00DC0000DE14110514FE01131211122D0811056F1D00000A00DC0072990000701104731400000A13050011056F1500000A13060038660100000012071106166F1600000A28030000060012077B02000004130B12077B01000004130C08110B6F1E00000A16FE01131211122D170009110B110C73070000066F1F00000A0000381A010000000612077B03000004120A6F1700000A16FE01131211122D740000110A6F2000000A13132B471213282100000A130D001207110D2804000006130E110E19FE0416FE01131211122D230009110B110C120D7B02000004120D7B01000004110E73080000066F1F00000A002B0E001213282200000A131211122DACDE0F1213FE160600001B6F1D00000A00DC00000712077B04000004120A6F1700000A16FE01131211122D740000110A6F2000000A13132B471213282100000A130F001207110F2805000006130E110E19FE0416FE01131211122D230009110B110C120F7B02000004120F7B01000004110E73080000066F1F00000A002B0E001213282200000A131211122DACDE0F1213FE160600001B6F1D00000A00DC0000000011066F1C00000A131211123A8AFEFFFF00DE14110614FE01131211122D0811066F1D00000A00DC0000DE14110514FE01131211122D0811056F1D00000A00DC00091214FE150400000211148C040000026F2300000A00198D1C000001131511151672F50000701F0C1F096A732400000AA211151772FF0000701F0C1F096A732400000AA2111518720B0100701E732500000AA21115732600000A1310282700000A11106F2800000A0000096F2900000A13162B481216282A00000A13110011101612117B080000046F2B00000A0011101712117B070000046F2B00000A0011101812117B090000046F2C00000A00282700000A11106F2D00000A00001216282E00000A131211122DABDE0F1216FE160700001B6F1D00000A00DC00282700000A6F2F00000A0000DE14110414FE01131211122D0811046F1D00000A00DC002A41C400000200000046000000AA000000F00000001400000000000000020000003C000000CC00000008010000140000000000000002000000AA01000058000000020200000F000000000000000200000036020000580000008E0200000F0000000000000002000000350100007F010000B40200001400000000000000020000002B010000A1010000CC0200001400000000000000020000005303000059000000AC0300000F000000000000000200000025000000A5030000CA03000014000000000000001E02283000000A2A03300400A0000000000000000002037D010000040203283200000A7D020000040203166F3300000A1F305920102700005A03186F3300000A1F305920E80300005A58031A6F3300000A1F30591F645A58031C6F3300000A1F30591F0A5A58031E6F3300000A1F3059587D030000040203176F3300000A1F305920E80300005A03196F3300000A1F30591F645A58031B6F3300000A1F30591F0A5A58031D6F3300000A1F3059587D040000042A133004007F0000000200001100027B0400000420E80300005B0F017B0400000420E80300005B2E03172B0116027B040000041F645B1F0A5D0F017B040000041F645B1F0A5D2E03172B011658027B040000041F0A5B1F0A5D0F017B040000041F0A5B1F0A5D2E03172B011658027B040000041F0A5D0F017B040000041F0A5D2E03172B0116580A2B00062A0013300400A50000000200001100027B0300000420102700005B0F017B0300000420102700005B2E03172B0116027B0300000420E80300005B1F0A5D0F017B0300000420E80300005B1F0A5D2E03172B011658027B030000041F645B1F0A5D0F017B030000041F645B1F0A5D2E03172B011658027B030000041F0A5B1F0A5D0F017B030000041F0A5B1F0A5D2E03172B011658027B030000041F0A5D0F017B030000041F0A5D2E03172B0116580A2B00062A000000133002005100000003000011000F017B060000040F027B06000004590A0616FE010C082D0500060B2B31000F017B050000040F027B05000004590A0616FE010C082D0500060B2B13000F017B090000040F027B09000004590B2B00072A960002037D0500000402047D0700000402037D0600000402047D0800000402167D090000042A9E0002037D0500000402047D0700000402057D06000004020E047D08000004020E057D090000042A0042534A4201000100000000000C00000076322E302E35303732370000000005006C00000040040000237E0000AC0400000805000023537472696E677300000000B40900001C01000023555300D00A0000100000002347554944000000E00A0000D001000023426C6F620000000000000002000001579702080900000000FA01330016000001000000240000000500000009000000080000000C00000001000000330000000C000000010000000300000007000000010000000200000000000A00010000000000060063005C0006006A005C0006008F00740006005401420106006B0142010600880142010600A70142010600C00142010600D90142010600F401420106000F02420106004702280206005B0242010600870274023B009B0200000600CA02AA020600EA02AA020A002F0314030600450374000600520374000A006F0359030A0090037D030A00A20359030A00AD0359030A00C9037D030600F5035C005300150400000A00480414030A00540408030A005E0414030A006C0414030A00770414030600CA0428020600E00428020600EB045C000600F7045C0000000000010000000000010001000100100019000000050001000100080110002A002E000900010003000801100039002E00090005000600080110004A002E000900050007002600AF001E002600BC0021002600C30021002600C80021002600FB002100260001012100260006011E00260012011E0026001D01210050200000000096009B00110001000025000000008618A900150001000825000000008618A90019000100B425000000008600CE00240002004026000000008600E10024000300F42600000000E601F3002A0004005127000000008618A900320006007727000000008618A90038000800000001002401000001002801000001002801000001003401000002003601000001002A0000000200380100000100FB00000002000601000003000101000004001201000005001D01040006002100A90019002900A90019003100A90019003900A90019004100A90019004900A90019005100A90019005900A90019006100A90041006900A90019007100A90046008100A9004C008900A90015009100A90015001400A90015001C00A90015002400A9001500A900A9001900B1009D031500B900A9007000B900BB037700C900D6037C001400E00381002C00A90015001400EC0391002C00EC0399001C00EC039100C900F0039F00D100010415001C000904A3002400EC0399002C002004A90034002E04B90034003A049F0024004304BE00E100A900C800E100A900D000F100A900D700F9007F04DE0001018804E40024002004A9003C002E04B900F10099043200F100A304F1000101AC04E4003C003A049F000101BB0415000900A90015000901A90053011901F1045A012101FE045F012000730051002E002B006E012E0013007E012E001B007E012E0023007E012E000B006E012E00330084012E003B007E012E004B007E012E005B009C012E006300A5012E006B00AE010000010000000400F700640168010A005600620069008A00B200EA000480000001000000CE0E56A20000000000002E000000020000000000000000000000010053000000000002000000000000000000000001000803000000000000003C4D6F64756C653E004368616C6C656E6765352E646C6C0053746F72656450726F636564757265730053534E004368616C6C656E6765350053534E4D61746368436F6D70617265720053534E4D61746368006D73636F726C69620053797374656D004F626A6563740056616C7565547970650053797374656D2E436F6C6C656374696F6E732E47656E657269630049436F6D7061726572603100446F53534E4D61746368696E67002E63746F720074686553534E537472696E670074686553534E004F646473004576656E73006765744576656E4D61746368537461747573006765744F64644D6174636853746174757300436F6D7061726500756553534E007653534E00756553534E537472696E67007653534E537472696E67005374617475730073736E007468654F7468657253534E007800790053534E537472696E670053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E4174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053797374656D2E44617461004D6963726F736F66742E53716C5365727665722E5365727665720053716C50726F6365647572654174747269627574650044696374696F6E6172796032004C69737460310053797374656D2E446174612E53716C436C69656E740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E640053716C4461746152656164657200457865637574655265616465720044624461746152656164657200476574537472696E670054727947657456616C75650041646400526561640049446973706F7361626C6500446973706F736500436F6E7461696E734B657900456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E74004D6F76654E65787400536F72740053716C4D657461446174610053716C4462547970650053716C446174615265636F72640053716C436F6E746578740053716C50697065006765745F506970650053656E64526573756C7473537461727400536574537472696E6700536574496E7433320053656E64526573756C7473526F770053656E64526573756C7473456E64005374727563744C61796F7574417474726962757465004C61796F75744B696E6400496E74333200506172736500537472696E67006765745F436861727300002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D0074007200750065000067530045004C0045004300540020005B0076005D002E005B00530053004E005D002000460052004F004D0020005B00560061006C006900640061007400650064005D0020005B0076005D0020005700490054004800200028004E004F004C004F0043004B002900005B530045004C0045004300540020005B00530053004E005D002000660072006F006D0020005B00550073006500720045006E00740065007200650064005D0020005700490054004800200028004E004F004C004F0043004B00290000097600530053004E00000B75006500530053004E00000D53007400610074007500730000000000E38105136F88B947B62E4A4C7C1576AC0008B77A5C561934E0890615120D0111140300000103200001042001010E02060E02060805200108110C072002081114111405200201080E08200501080E080E08042001010205200101113D042001010804010000000B15124D020815125101110C0615124D02081C06151251011114062002010E125504200012610420010E080820020213001013010615125101110C07200201130013010520010113000320000205200102130008200015116D0113000615116D01110C04200013000920010115120D011300072003010E11750A062002010E1175062001011D12710500001280810520010112790615116D0111140520020108085B071715124D020815125101110C15124D020815125101110C15124D02081C1512510111141255125D1261110C15125101110C15125101110C15125101110C080E110C08110C127911140215116D01110C11101D127115116D01111406200101118089040001080E0420010308030701080507030808020F01000A4368616C6C656E676535000005010000000017010012436F7079726967687420C2A920203230313000000801000701000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000000000002C1DF34B0000000002000000620000006C3400006C16000052534453F180F429CFADA642AEA4A8FFC152038B02000000433A5C436F64655C41746C616E7469735C5468726F77617761795C4368616C6C656E6765355C4368616C6C656E6765355C6F626A5C44656275675C4368616C6C656E6765352E706462000000F834000000000000000000000E350000002000000000000000000000000000000000000000000000003500000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000F00200000000000000000000F00234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE000001000000010056A2CE0E0000010056A2CE0E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00450020000010053007400720069006E006700460069006C00650049006E0066006F0000002C020000010030003000300030003000340062003000000040000B000100460069006C0065004400650073006300720069007000740069006F006E00000000004300680061006C006C0065006E006700650035000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003700390030002E00340031003500350038000000000040000F00010049006E007400650072006E0061006C004E0061006D00650000004300680061006C006C0065006E006700650035002E0064006C006C00000000004800120001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A900200020003200300031003000000048000F0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000004300680061006C006C0065006E006700650035002E0064006C006C000000000038000B000100500072006F0064007500630074004E0061006D006500000000004300680061006C006C0065006E006700650035000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003700390030002E00340031003500350038000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003700390030002E00340031003500350038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000203500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE
GO
ALTER ASSEMBLY [Challenge5]
WITH VISIBILITY = ON

GO
CREATE PROCEDURE [dbo].[DoSSNMatching]
AS EXTERNAL NAME [Challenge5].[StoredProcedures].[DoSSNMatching]
GO

And then

EXEC dbo.[DoSSNMatching]
1 comment
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Scot Hauder avatar image Scot Hauder commented ·
nice ~653
0 Likes 0 ·
Matt Whitfield avatar image
Matt Whitfield answered

Matt v2

The 'Single query to bring happiness to Peso' version :)

Only very slightly different to v1.

WITH UserEnteredTmp ([u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [odds], [evens], [ssn])
AS
(
SELECT [u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [u1] + [u3] + [u5] + [u7] + [u9], [u2] + [u4] + [u6] + [u8], [SSN] FROM 
(
       SELECT SUBSTRING(SSN, 1, 1) AS u1, SUBSTRING(SSN, 2, 1) AS u2, SUBSTRING(SSN, 3, 1) AS u3, SUBSTRING(SSN, 4, 1) AS u4,
              SUBSTRING(SSN, 5, 1) AS u5, SUBSTRING(SSN, 6, 1) AS u6, SUBSTRING(SSN, 7, 1) AS u7, SUBSTRING(SSN, 8, 1) AS u8,
              SUBSTRING(SSN, 9, 1) AS u9, [SSN]
       FROM  (SELECT [SSN] AS SSN 
                FROM [dbo].[UserEntered] 
               WHERE [SSN] NOT IN 
                    (SELECT [SSN] 
                       FROM [dbo].[Validated])
              ) idat
) odat
),
ValidatedTmp ([u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [odds], [evens], [ssn])
AS
(
SELECT [u1], [u2], [u3], [u4], [u5], [u6], [u7], [u8], [u9], [u1] + [u3] + [u5] + [u7] + [u9], [u2] + [u4] + [u6] + [u8], [ssn] FROM 
(
       SELECT SUBSTRING(SSN, 1, 1) AS u1, SUBSTRING(SSN, 2, 1) AS u2, SUBSTRING(SSN, 3, 1) AS u3, SUBSTRING(SSN, 4, 1) AS u4,
              SUBSTRING(SSN, 5, 1) AS u5, SUBSTRING(SSN, 6, 1) AS u6, SUBSTRING(SSN, 7, 1) AS u7, SUBSTRING(SSN, 8, 1) AS u8,
              SUBSTRING(SSN, 9, 1) AS u9, [SSN]
         FROM [dbo].[Validated]
) odat
)
SELECT   [vSSN], [ueSSN], [Status]
FROM     (SELECT [SSN] AS ueSSN, [SSN] AS vSSN, 0 AS [Status]
          FROM   (SELECT [dbo].[UserEntered].[SSN] AS SSN
                  FROM   [dbo].[UserEntered]
                  WHERE  [SSN] IN (SELECT [SSN]
                                   FROM   [dbo].[Validated])) AS idat
          UNION ALL
          SELECT [ueSSN], [vSSN], [Status]
          FROM   (SELECT [UserEnteredTmp].[ssn] AS ueSSN, [ValidatedTmp].[ssn] AS vSSN,
                         CASE WHEN [ValidatedTmp].[u2] = [UserEnteredTmp].[u2] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u4] = [UserEnteredTmp].[u4] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u6] = [UserEnteredTmp].[u6] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u8] = [UserEnteredTmp].[u8] THEN 0 ELSE 1 END AS [Status]
                  FROM   UserEnteredTmp INNER JOIN
                         ValidatedTmp ON [UserEnteredTmp].[odds] = [ValidatedTmp].[odds]) AS idat
          WHERE  [Status] < 3
          UNION ALL
          SELECT [ueSSN], [vSSN], [Status]
          FROM   (SELECT [UserEnteredTmp].[ssn] AS ueSSN, [ValidatedTmp].[ssn] AS vSSN,
                         CASE WHEN [ValidatedTmp].[u1] = [UserEnteredTmp].[u1] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u3] = [UserEnteredTmp].[u3] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u5] = [UserEnteredTmp].[u5] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u7] = [UserEnteredTmp].[u7] THEN 0 ELSE 1 END + CASE WHEN [ValidatedTmp].[u9] = [UserEnteredTmp].[u9] THEN 0 ELSE 1 END AS [Status]
                  FROM   UserEnteredTmp INNER JOIN
                         ValidatedTmp ON [UserEnteredTmp].[evens] = [ValidatedTmp].[evens]) AS idat
          WHERE  [Status] < 3
         ) AS idd
ORDER BY [vSSN], [ueSSN], [Status];
1 comment
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image Peso commented ·
Very similar to my "one-liner" !
0 Likes 0 ·
Daniel Ross avatar image
Daniel Ross answered

I have a good Unusual/experimental attempt that I created for s#$%'s and giggles, however all of the logic is entirely in SSIS 2005.

If I am allowed to enter this, how do I get this package to you Peso? I can copy the XML here then you will have to set the connection, but it is long.

the package has only two components; an execute SQL task which creates the results table, and a data flow task.

In the data flow task there are only 2 data sources and 1 destination, however there are quite a few merge join components and conditional split components. note, there are no script components

It runs in BIDS for about 2 seconds on my PC, but on a gutsy server in might be slightly faster.

It's raining green baby!

6 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Matt Whitfield avatar image Matt Whitfield ♦♦ commented ·
I hope there is a way to include this - because I would say that fits directly in unusual/experimental - top job!
0 Likes 0 ·
Phil Factor avatar image Phil Factor commented ·
I think it would qualify as unusual. I'd love to see it.
0 Likes 0 ·
Peso avatar image Peso commented ·
Email me the zipped project, and I'll test it with SQL Profiler.
0 Likes 0 ·
Peso avatar image Peso commented ·
I wonder if Fuzzy Lookup would do the work?
0 Likes 0 ·
Peso avatar image Peso commented ·
Have you found my email adress?
0 Likes 0 ·
Show more comments
JAhlen avatar image
JAhlen answered

The pure SQL CLR solution v3

CREATE ASSEMBLY [SSNMatch]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300B634F54B0000000000000000E00002210B0108000014000000060000000000006E320000002000000040000000004000002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000203200004B000000004000008003000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000074120000002000000014000000020000000000000000000000000000200000602E7273726300000080030000004000000004000000160000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001A00000000000000000000000000004000004200000000000000000000000000000000503200000000000048000000020005006C270000B40A000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B300600A80400000100001120102700008D100000010A2010270000730E00000A0B2010270000730E00000A0C20307500008D100000010D2010270000730F00000A130420A0860100730F00000A13057201000070731000000A130611066F1100000A72310000701106731200000A130711076F1300000A130816130938900000001108166F1400000A130A061109110A9E110A2804000006130B110A2805000006130C07110B6F1500000A2C1107110B6F1600000A110A6F080000062B1907110B110A73070000066F1700000A1105110B176F1800000A08110C6F1500000A2C1108110C6F1600000A110A6F080000062B1908110C110A73070000066F1700000A1104110C176F1800000A11091758130911086F1900000A3A64FFFFFFDE0C11082C0711086F1A00000ADCDE0C11072C0711076F1A00000ADC728F0000701106731200000A130D110D6F1300000A130E16130F2B1109110F251758130F110E166F1400000A9E110E6F1900000A2DE6DE0C110E2C07110E6F1A00000ADCDE0C110D2C07110D6F1A00000ADCDE0C11062C0711066F1A00000ADC198D19000001131F111F1672F1000070191F096A731B00000AA2111F1772FB000070191F096A731B00000AA2111F1872070100701F14731C00000AA2111F731D00000A1310281E00000A11106F1F00000A1F098D1E0000011311098E691312161313389F020000091113941314111428040000061315111428050000061316110511156F2000000A2C57110411166F2000000A2C4C061114280100002B163241111111142802000006111016166A1111161F096F2200000A111017166A1111161F096F2200000A111018166F2300000A281E00000A11106F2400000A381F020000110511156F2000000A39F00000000711156F1600000A131716131838D000000011177B01000004111894131911191F0A5B1F0A5D11161F0A5D3303162B0117131A111A111920E80300005B1F0A5D11161F0A5B1F0A5D3303162B011758131A111A111920A08601005B1F0A5D11161F645B1F0A5D3303162B011758131A111A111920809698005B1F0A5D111620E80300005B1F0A5D3303162B011758131A111A183047111111192802000006111016166A1111161F096F2200000A111111142802000006111017166A1111161F096F2200000A111018111AD26F2300000A281E00000A11106F2400000A111817581318111811177B020000043F22FFFFFF110411166F2000000A39130100000811166F1600000A131B16131C38F3000000111B7B01000004111C94131D111D280400000626111D1F0A5D11151F0A5D3303162B0117131E111E111D1F645B1F0A5D11151F0A5B1F0A5D3303162B011758131E111E111D20102700005B1F0A5D11151F645B1F0A5D3303162B011758131E111E111D2040420F005B1F0A5D111520E80300005B1F0A5D3303162B011758131E111E111D2000E1F5055B1F0A5D111520102700005B1F0A5D3303162B011758131E111E1830471111111D2802000006111016166A1111161F096F2200000A111111142802000006111017166A1111161F096F2200000A111018111ED26F2300000A281E00000A11106F2400000A111C1758131C111C111B7B020000043FFFFEFFFF111317581313111311123F58FDFFFF281E00000A6F2500000A2A417C0000020000006E000000A6000000140100000C000000000000000200000065000000BD000000220100000C00000000000000020000004501000021000000660100000C00000000000000020000003C01000038000000740100000C00000000000000020000005000000032010000820100000C00000000000000033005008B0000000000000002161F30032000E1F5055B58D19D02171F300320809698005B1F0A5D58D19D02181F30032040420F005B1F0A5D58D19D02191F300320A08601005B1F0A5D58D19D021A1F300320102700005B1F0A5D58D19D021B1F300320E80300005B1F0A5D58D19D021C1F30031F645B1F0A5D58D19D021D1F30031F0A5B1F0A5D58D19D021E1F30031F0A5D58D19D2A00133003007000000002000011026F2600000A0A0616931F30592000E1F5055A0617931F305920809698005A580618931F30592040420F005A580619931F305920A08601005A58061A931F305920102700005A58061B931F305920E80300005A58061C931F30591F645A58061D931F30591F0A5A58061E931F3059582A033003004000000000000000021F0A5D021F645B1F0A5D1F0A5A580220102700005B1F0A5D1F645A58022040420F005B1F0A5D20E80300005A58022000E1F5055B1F0A5D20102700005A582AD6021F0A5B1F0A5D0220E80300005B1F0A5D1F0A5A580220A08601005B1F0A5D1F645A580220809698005B1F0A5D20E80300005A582A1E02282700000A2A8E021C8D100000017D0100000402282700000A027B0100000416039E02177D020000042A0000133004001A00000003000011027B0100000402257B02000004250A17587D0200000406039E2A000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000060030000237E0000CC0300004C04000023537472696E67730000000018080000180100002355530030090000100000002347554944000000400900007401000023426C6F62000000000000000200000157150208090A000000FA253300160000010000001F00000003000000020000000800000007000000270000000B00000003000000010000000100000002000000010000000100000000000A00010000000000060046003F000A00880073000600EE00DC0006000501DC0006002201DC0006004101DC0006005A01DC0006007301DC0006008E01DC000600A901DC000600E101C2010600F501DC0006002E020E0206004E020E020A00900275020600A6023F000600C702AC020600E702D4020A000603F0020A00270314030A003903F0020A004403F0020A0060031403060094033F000A00A80375020A00B40367000A00BE0375020A00CC0375020A00D70375020600F9033F000600FE033F000000000001000000000001000100010010001700000005000100010002001000280000000500010007000600B60024000600BA00280050200000000096004D000A000100802500000000910057000E00010018260000000091009100150003009426000000009100A1001B000400E026000000009100A9001B0005001627000000008618B000200006001E27000000008618B0002B0006004427000000008600C0002B00070000000100C40000000200CB0000000100CF0000000100D80000000100D80000000100CB0000000100CB001900B00030002100B00030002900B00030003100B00030003900B00030004100B00030004900B00030005100B00030005900B00035006100B00030006900B0002B007100B00020007900B00020000C00B0002B009100B0002B009900B0003000A10034032000A900B0004700A90052034E00B9006D0353000C00760358000C0082035E000C00C000650091008B036D00B9008F037300C100A0032000C900B0007700C900B0007F00D900B0008600E100DF038D00E900E8039200910082039800F90004049D00D9001104AB00D9001A04B500E90022049200E9003104200011004004F9000900B000200020006B003A002E002B0007012E00130015012E001B0015012E0023001B012E000B0007012E0033002A012E003B0015012E004B0015012E005B004B012E0063005401BB00FE0003013F000480000001000000D00EA3630000000000006C02000002000000000000000000000001003600000000000200000000000000000000000100670000000000030002004300A7000000003C4D6F64756C653E0053534E4D617463682E646C6C0053746F72656450726F636564757265730053534E436F6C6C656374696F6E006D73636F726C69620053797374656D004F626A656374004D6174636850726F6300496E743332546F53716C43686172730053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C43686172730053716C4368617273546F496E743332004765744576656E004765744F6464002E63746F720041727200436F756E7400416464006275666665720073736E0073716C4368617273006E756D0053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7956657273696F6E4174747269627574650053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053534E4D61746368004D6963726F736F66742E53716C5365727665722E5365727665720053716C50726F63656475726541747472696275746500496E7433320053797374656D2E436F6C6C656374696F6E732E47656E657269630044696374696F6E61727960320053797374656D2E436F6C6C656374696F6E730042697441727261790053797374656D2E446174612E53716C436C69656E740053716C436F6E6E656374696F6E0053797374656D2E446174612E436F6D6D6F6E004462436F6E6E656374696F6E004F70656E0053716C436F6D6D616E640053716C4461746152656164657200457865637574655265616465720044624461746152656164657200476574496E74333200436F6E7461696E734B6579006765745F4974656D0053657400526561640049446973706F7361626C6500446973706F73650053716C4D657461446174610053716C4462547970650053716C446174615265636F72640053716C436F6E746578740053716C50697065006765745F506970650053656E64526573756C7473537461727400436861720041727261790042696E61727953656172636800536574436861727300536574427974650053656E64526573756C7473526F770053656E64526573756C7473456E64006765745F4275666665720000002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D007400720075006500005D530045004C004500430054002000430041005300540028005B00530053004E005D00200041005300200049004E00540029002000460052004F004D002000640062006F002E005B00560061006C006900640061007400650064005D000061530045004C004500430054002000430041005300540028005B00530053004E005D00200041005300200049004E00540029002000460052004F004D002000640062006F002E005B00550073006500720045006E00740065007200650064005D0000097600530053004E00000B75006500530053004E00000D53007400610074007500730000000000A8F41A33B140D44E8FACD9AF9890634B0008B77A5C561934E08903000001060002011D030805000108120904000108080320000103061D080206080420010108042001010E04200101020401000000071512450208120C062002010E124D0420001259042001080805200102130006200113011300072002011300130105200201080203200002072003010E11690A062002010E1169062001011D1265040000127505200101126D042001020809100102081D1E001E00030A010809200501080A1D0308080520020108053D07201D081512450208120C1512450208120C1D0812491249124D12551259080808081255125908126D1D030808080808120C080808120C0808081D12650420001D030407011D03030701080D01000853534E4D6174636800000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230313000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301004832000000000000000000005E320000002000000000000000000000000000000000000000000000503200000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000280300000000000000000000280334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE0000010000000100A363D00E00000100A363D00E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00488020000010053007400720069006E006700460069006C00650049006E0066006F00000064020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F006600740000003C0009000100460069006C0065004400650073006300720069007000740069006F006E0000000000530053004E004D0061007400630068000000000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003700390032002E0032003500350030003700000000003C000D00010049006E007400650072006E0061006C004E0061006D0065000000530053004E004D0061007400630068002E0064006C006C00000000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F0066007400200032003000310030000000000044000D0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530053004E004D0061007400630068002E0064006C006C0000000000340009000100500072006F0064007500630074004E0061006D00650000000000530053004E004D0061007400630068000000000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003700390032002E00320035003500300037000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003700390032002E0032003500350030003700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000C000000703200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE

GO

CREATE PROCEDURE [dbo].[MatchProc]
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SSNMatch].[StoredProcedures].[MatchProc]
GO

and then execute it:

EXEC dbo.[MatchProc]
5 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

JAhlen avatar image JAhlen commented ·
Now it takes less than 400 ms on my laptop.
0 Likes 0 ·
Matt Whitfield avatar image Matt Whitfield ♦♦ commented ·
Keeping me on my toes - love it :)
0 Likes 0 ·
Peso avatar image Peso commented ·
Unfortenately, it doesn't produce the correct result.
0 Likes 0 ·
JAhlen avatar image JAhlen commented ·
Really??? I will check.
0 Likes 0 ·
Peso avatar image Peso commented ·
It is the sorting that is missong. Sort by vSSN, ueSSN and [Status] and your result is ok.
0 Likes 0 ·

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.