- Semi-joins return rows from the first table where matches are found in the second table, but return each matching row from the first table only once. Anti-joins return rows from the first table where no matches are found in the second table.
- Semi-joins can be written using EXISTS or IN clauses, while anti-joins use NOT EXISTS or NOT IN. This allows Oracle to use more efficient semi-join and anti-join access paths.
- Oracle has improved at optimizing queries with EXISTS and IN clauses over time, and in Oracle 9i and later the choice is usually not important as Oracle will generate efficient plans for both.