Search code examples
sqlpostgresqljoinansi-sql

Does the order of tables in a join matter, when LEFT (outer) joins are used?


I would like to confirm that the SQL query

SELECT ....
  FROM apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas
 WHERE ....

is exactly equivalent to other permutations in the FROM subclause, like

SELECT ....
  FROM oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas,
       apples
 WHERE ....

or

SELECT ....
  FROM bananas,
       apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id
 WHERE ....

as long as the explicit LEFT JOIN between oranges and kiwis remains intact. From what I've read in various documents, the returned set should be exactly the same.

I'm really only concerned with the results of the query, not its performance in an actual database. (I'm using PostgreSQL 8.3, which AFAIK doesn't support optimizer hints about the join order, and will try to create an optimal query plan automatically).


Solution

  • It is the same but it is ambiguous as hell with the implicit CROSS JOINs. Use explicit JOINS.

    If you are joining in the WHERE clause then the results may differ because joins and filters are mixed up.

    SELECT ....
      FROM apples a
           JOIN
           bananas b ON ...
           JOIN 
           oranges o ON ...
           LEFT JOIN
           kiwis k ON k.orange_id = o.id
     WHERE (filters only)
    

    Notes:

    • INNER JOINS and CROSS JOINS are commutative and associative: order does not matter usually.
    • OUTER JOINS are not, which you identified
    • SQL is declarative: you tell the optimiser what you want, not how to do it. This removes JOIN order considerations (subject to the previous 2 items)