Это должно сделать:
with sample_data as (
select 1 as id, 'aa'::text as val
union all
select 2 as id, 'bb'::text as val
union all
select 3 as id, 'cc'::text as val
),
sample_data2 as (
select 4 as id, 'dd'::text as val
union all
select 5 as id, 'ee'::text as val
union all
select 6 as id, 'ff'::text as val
)
, sd_rn as (
select id
, val
, row_number() over (order by id) rn
from sample_data
)
, sd2_rn as (
select id
, val
, row_number() over (order by id) rn
from sample_data2
)
select *
from sd_rn s1
join sd2_rn s2 on s1.rn = s2.rn
Первые два CTE предназначены только для генерации двух образцов таблиц.
Я не уверен, что вы подразумеваете под индексом, но вам понадобится какой-то уникальный идентификатор для каждой строки, чтобы вы могли использовать row_number (), как показано выше.
Кроме того, sql не гарантирует какой-либо порядок, поэтому убедитесь, что вы также указали его.
Затем вы просто присоединяетесь к номеру строки, сгенерированному оконной функцией.
Приведенный выше метод будет работать с любым количеством столбцов.