the reason it isn't working is that the value needs to exist in table1 to be seen as parameter to the subreport that lookes at table2. The join in this case shouldn't make a difference as there is never an entry in table 1 that will trigger the subreport to display for table2.
I like stored procs, as they can easily get around this type of situation. A possibility is to have a an entry from Table1 for null values, or to have a 2nd subreport that displays entries in table 2 that don't have entries in table 1
OR
use your contract_code table(I would assume that there is one) as the 'main' table in your report, then you can left outer join both table1 and table2 to it, and you can have the contract_code from the main table be the link to the subreport, then all contracts entries should be found as you are no longer relying on the value existing in Table1 to find the value in Table2
HTH