Archive for June 10th, 2009
Joining unjoinable
Comments enabled. I *really* need your comment
From Stack Overflow:
I want to combine two tables into one.
Let say I have:
Table1:
ID Name 1 A 2 B 3 C Table2:
ID Name 4 D 5 E 6 F I want to make Table3:
Name1 Name2 A D B E C F How can I do this in SQL Server?
This a certainly a task for a JOIN
, since we have two tables here and want to match any row from the first table with another row from the second table.
But what condition do we use for a JOIN
?
The ID
's of the rows seem to be arbitrary and have no special meaning. They could as well be sparse and randomly distributed, so it's impossible to build a formula which corresponds one ID
to another. Same is true for the names.
However, there actually is a condition which we could JOIN
on.
Since the author mentioned there is same number of rows in both tables, we could use the ROW_NUMBER()
as a JOIN
condition.
We just need to wrap both these queries into CTE's which select a ROW_NUMBER()
along with the table data:
WITH table1 AS ( SELECT 1 AS id, 'A' AS name UNION ALL SELECT 2 AS id, 'B' AS name UNION ALL SELECT 3 AS id, 'C' AS name ), table2 AS ( SELECT 4 AS id, 'D' AS name UNION ALL SELECT 5 AS id, 'E' AS name UNION ALL SELECT 6 AS id, 'F' AS name ), q1 AS ( SELECT table1.*, ROW_NUMBER() OVER (ORDER BY name) AS rn FROM table1 ), q2 AS ( SELECT table2.*, ROW_NUMBER() OVER (ORDER BY name) AS rn FROM table2 ) SELECT q1.name, q2.name FROM q1 JOIN q2 ON q2.rn = q1.rn
name | name | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | D | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B | E | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
C | F | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 rows fetched in 0.0002s (0.0264s) |
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 4 ms.