このタイプのクエリは、結合してから優先順位を使用することで実行できます。
select b.*,
(case when u.id is not null then u.fname else tu.fname end) as fname,
(case when u.id is not null then u.lname else tu.lname end) as lname
from booking b left outer join
user u
on b.user_id = u.id left outer join
tmp_user tu
on b.user_id = tu.id
and u.uid is null
2 番目の結合に条件を追加することもできます。それがパフォーマンスに役立つか妨げになるかはわかりません。
ユーザー テーブルの値が必要な場合は、ロジックを少し変更するだけです。
select b.*,
(case when b.user_table = 'user' then u.fname else tu.fname end) as fname,
(case when b.user_table = 'tmp_user' then u.lname else tu.lname end) as lname
from booking b left outer join
user u
on b.user_id = u.id left outer join
tmp_user tu
on b.user_id = tu.id;