А в чем проблема?
users - это одно множество;
wallets - это другое множество;
wallet_address - пересечение множеств (таблица с хордами [user_id, wallet_id]).
Нужно просто склеить все таблицы по соответствующим ключам и вывести те записи из users, которые пересекаются с записями wallets с непустым value.
select u.user_id, w.wallet_id, wa.value as address
from users u
join wallet_address wa on wa.user_id = u.user_id
join wallets w on w.wallet_id = wa.wallet_id
where wa.value is not null
PS: А вы уверены, что адрес кошелька должен определяться по комбинации [user_id, wallet_id], это разве не самостоятельное свойство кошелька, то есть конкретной записи wallets?
Если это так, то value будет относиться к wallets, а таблица wallet_address не будет иметь отношение к адресу, она просто будет хранить два внешних ключа user_id и wallet_id, чтобы выполнять исключительно функцию хранения хорд пересечений n:n.