The where clause effectively made your last left join the inner join.
To correct the movement of left join filter criteria in join criteria
select d2.*
from Devices as d1
left outer join Links as l on d1.id in (l.device_id_1, l.device_id_2)
left outer join Devices as d2 on d2.id in (l.device_id_1, l.device_id_2)
and d2.id <> 398
where d1.id = 398;
A less elegant, although generally accepted approach would be ...
select d2.*
from Devices as d1
left outer join Links as l on d1.id in (l.device_id_1, l.device_id_2)
left outer join Devices as d2 on d2.id in (l.device_id_1, l.device_id_2)
where d1.id = 398
and (d2.id <> 398 OR D2.ID is null)
I generally think so about it.
, , . , . , where, , , , NULLS.
, < > ... < > , , .
1 = NULL NULL, 1 < > NULL NULL; ,