Skip to content
Advertisement

PostgreSQL cross join using max returns null

I want to select the max() value of the modified_at column in each of several tables:

select 
max(a.modified_at) as a_modified_at,
max(b.modified_at) as b_modified_at,  
max(c.modified_at) as c_modified_at 
from a, b, c;

This works correctly as long as each of the tables has at least 1 row. The problem is that when just one of the tables has 0 rows, null is returned for all tables:

null,null,null

What is a solution that returns the correct values for the tables that do have rows? PostgreSQL-10

Advertisement

Answer

Using OUTER JOINs should do it

select 
max(a.modified_at) as a_modified_at,
max(b.modified_at) as b_modified_at,  
max(c.modified_at) as c_modified_at 
from a outer join b outer join c;

but a possibly simpler option would be to use 3 subqueries instead:

select 
(select max(modified_at) from a) as a_modified_at,
(select max(modified_at) from b) as b_modified_at,  
(select max(modified_at) from c) as c_modified_at;
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement