Второй вариант можно реализовать с помощью row_number()
и условного агрегирования, например, так:
select
t.name,
t.testid,
t.starttime,
t.status,
max(case when i.rn = 1 then i.image end) image01,
max(case when i.rn = 2 then i.image end) image02,
...
max(case when i.rn = 10 then i.image end) image10
from test t
left join (
select testid, image, row_number() over(partition by testid order by imageid) rn
from images
) i on i.testid = t.testid
group by t.name, t.testid, t.starttime, t.status
Вы также можете использовать outer apply
, что может быть более эффективным:
select
t.*,
i.*
from test t
outer apply (
select
max(case when rn = 1 then image end) image01,
max(case when rn = 2 then image end) image02
...
max(case when rn = 10 then image end) image10
from (
select image, row_number() over(order by imageid) rn
from image i
where i.testid = t.testid
) i
) i