I have two tables, Table1 and Table2, that I want to join. Each table has two unique keys, lets call them Key1 and Key2. What I want to do is LEFT JOIN Table2 to Table1 where any of the keys match in any of the four possible combinations:
My question is: is there any efficient way to do this? Right now I've come up with something like this, but it takes forever to run.
CREATE TABLE NEW_TABLE AS
SELECT a.*,
CASE WHEN a.Key1 = b.Key1 THEN 1 ELSE 0 END AS match1,
CASE WHEN a.Key1 = c.Key2 THEN 1 ELSE 0 END AS match2,
CASE WHEN a.Key2 = b.Key1 THEN 1 ELSE 0 END AS match3,
CASE WHEN a.Key2 = c.Key2 THEN 1 ELSE 0 END AS match4
FROM Table1 a
LEFT JOIN (Select Key1 From Table2 Where Key1 is not null) b
on a.Key1 = b.Key1 or a.Key2 = b.Key1
LEFT JOIN (Select Key2 From Table2 Where Key2 is not null) c
on a.Key1 = c.Key2 or a.Key2 = c.Key2
;
Hopeless, I know...
EDIT: Example data and desired results below:
Table 1:
Key1 Key2 Sales Revenue
qwer!@ dhfgfw 455 30005
asdf#$ dfg654 221 28711
edfr2# gg%%^f 213 31667
gthy!2 awd^&5 133 13345
rf$#22 34ffgg 655 41237
bhjk%g w3erff 122 10066
f&*yhj dffghj 126 11004
Table 2:
Key1 Key2
qwer!@ {null}
{null} dfg654
ffgww2 ppolkk
{null} gthy!2
jjjj33 l00kjl
nmnmnm 34ffgg
awd^&5 {null}
Desired Result:
Key1 Key2 Sales Revenue match1 match2 match3 match4
qwer!@ dhfgfw 455 30005 1 0 0 0
asdf#$ dfg654 221 28711 0 0 0 1
edfr2# gg%%^f 213 31667 0 0 0 0
gthy!2 awd^&5 133 13345 1 0 1 0
rf$#22 34ffgg 655 41237 0 0 0 1
bhjk%g w3erff 122 10066 0 0 0 0
f&*yhj dffghj 126 11004 0 0 0 0
or
in join conditions can be a performance problem. I would suggest that you use exists
instead:
SELECT a.*,
(case when exists (select 1 from table2 b where a.Key1 = b.Key1) then 1 else 0 end) as match1,
(case when exists (select 1 from table2 b where a.Key1 = b.Key2) then 1 else 0 end) as match2,
(case when exists (select 1 from table2 b where a.Key2 = b.Key1) then 1 else 0 end) as match3,
(case when exists (select 1 from table2 b where a.Key2 = b.Key2) then 1 else 0 end) as match4
FROM Table1 a;
Filtering out the NULL
doesn't really matter because NULL
will fail the comparison anyway.
For best performance, you want indexes on table2(key1)
and table2(key2)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With