This should do it and I think your sample output is wrong. The max for IDTB1 is 18 and not 10
First select all the max using ROW_NUMBER over function from TB2 then join Tb1
SELECT Id2, Sname, SValue
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY [IDTB1] ORDER BY svalue DESC) AS rn
FROM dbo.TB2
) q
JOIN dbo.TB1
ON q.[IDTB1] = dbo.TB1.[Id1]
WHERE rn = 1
Output:
Id2 Sname SValue
4 Name1 13
7 Name2 18
11 Name3 22