Did you check in the log file the generated sql statment ?
I think that the left join is applied before the full outer is computed.
I've tried reviewing the logs and doing a performance recording to see if it would show me the SQL that is executed but it hasn't.
With your comment on the LEFT JOIN being applied before the FULL OUTER, I re-wrote my SQL query to compile the LEFT JOIN to a temp table then FULL OUTER after that but still returned the same results.
Any chance you can post the SQL that you wrote ?
You can also use Performance Recorder to see what Tableau wrote (for the comparison), but then you need to find out how to make Tableau do what you think it should be doing
Finally figured it out.
It came down to the fact that my data extract I was using from the server had a date filter and when I republished my data source it was sending this filter up as well... rookie mistake but glad to have found it.