Här är ett alternativ till PIVOT
dina resultat med MAX
med CASE
som inte kräver att bordet går tillbaka till sig självt:
select t.id1, t.id2, t.a, t.b,
max(case when t2.name = 'C1' then t2.vint end) c1,
max(case when t2.name = 'C2' then t2.vstring end) c2,
max(case when t2.name = 'C3' then t2.vdata end) c3
from tab1 t
left join tab2 t2 on t.id1 = t2.id1 and t.id2 = t2.id2
group by t.id1, t.id2, t.a, t.b