Вам нужен "номер строки" для join
.В ваших таблицах такого нет, но вы можете добавить его, используя row_number()
:
select coalesce(t1.id, t2.id) as id,
t1.name, t1.cost, t2.info1, t2.info2
. . .
from (select t1.*, row_number() over (partition by id order by (select null)) as seqnum
from table1 t1
) full join
(select t2.*, row_number() over (partition by id order by (select null)) as seqnum
from table2 t2
) t2
on t1.id = t2.id and t1.seqnum = t2.seqnum;
Вы, увы, не получите name
, используя этот метод.Но это имеет смысл.Это только в table1
, поэтому оно не должно быть в каждой соответствующей строке.
РЕДАКТИРОВАТЬ:
Это не совсем верно.Вы хотите, чтобы строки повторялись.И тогда значения не появятся.Я думаю, что это условная логика:
Если вам это действительно нужно:
select t1.id, t1.name,
(case when row_number() over (partition by t1.id order by (select null)) = 1 then cost END) as Cost,
t2.info1, t2.info2
from table1 t1 join
table2 t2
on t1.id = t2.id ;