Building on what has already been said about joins, and hopefully clarifying… you should only see duplicates in your data if the join is not based on totally unique keys in both of the tables being joined. That should hold irrespective of the type of join used.

If my (left) table contains

and my (right) table contains

With an outer join, the rows returned are:

This output comprises all that are ONLY in left, plus all that are ONLY in right, plus all joined rows that are in BOTH)

It follows therefore that provided the join finds UNIQUE rows in both tables, then the total number of rows returned can never be more than the sum of the total rows in both tables (which is the limit for when no rows match). The lower bound for the returned rows is if the set of all the keys from one table is a *subset* of the keys from the other table, When this occurs, the the total rows returned will never be more than the size of the larger table.

So for an outer join, the range of counts of possible rows returned, *assuming unique keys in both tables* is

`count of rows in larger table <= rows returned <= sum of count of rows from both tables`

The only time you should get “duplicates”, and therefore exceed the sum of rows from both tables is if you are using non-unique keys from one or other of the tables in which case, you will get “cross joining” of those specific data items

If my left table were

and my right table were:

then the full outer join will now see two rows containing B (the cross join for B being 2 rows x 1 row = 2 rows) and two containing A

If B appeared twice in *both* tables, I would expect to see 4 rows containing B (the cross join for “B” being 2 rows x 2 rows = 4 rows)

So if in the above example my right table were:

This would now result in the following:

So, in summary, if you are getting duplication out of a full outer join, this *must be* because you are using join criteria that is *non-unique* on either one or both of your input tables.