Możesz to rozwiązać w prostszy sposób:
select ts recordtime, max(to1) tempout, max(to2) tempoutstamb, max(to3) tempoutstamb2
from (
select ts, tempout to1, cast (null as numeric(10,1)) to2, cast (null as numeric(10,1)) to3
from table1
union all
select ts, null, tempout, null
from table2
union all
select ts, null, null, tempout
from table3
) tt
group by ts
order by ts;
Znajdziesz go w skrzypcach https://www.db-fiddle.com/f /eJsPZijRnQFGXugLGHnn93/0
UWAGA:Założyłem, że wartości null wyświetlane jako „-” to tylko formatowanie wyjściowe. Jeśli tak nie jest, dane wyjściowe z NULL można przekonwertować na „-”.
UWAGA2:Nie wiem, jak przekonwertować kod Laravel/PHP, mam nadzieję, że masz lepszy pomysł.