I think that temporary tables behave differently on Oracle and SQL server so what type of DB you are using will affect the answer.
Is this a one off or a regular report?
If it is a one off and you are using Oracle I’d probably create a table (TableC1) of only the most recent TableC data using a select (CTAS) with a low PCTFREE and a analytic function to get the first row e.g row_number() over (partition by KeyPt1 KeyPt2 order by SomeData )
Then index the KeyPt1 KeyPt2 columns
Create another table (CTAS) (TableC2) by selecting from TableC1 where there isn’t a record in TableB
Create another table (CTAS) (TableB1+C2) another table that duplicates TableB then insert into this table all the data in TableC2
Create a final table also using a CTAS by joining TableA and TableB1+C2.