Вы можете использовать join
:
select i1.col, i2.col, i3.col
from input i1 join
input i2
on i2.col not in (i1.col) join
input i3
on i3.col not in (i1.col, i2.col);
Здесь является тестером для этого решения.
EDIT:
Мне приходит в голову, что вы можете захотеть изменить длину input
и вам действительно нужны строки со всеми перестановками.
Если это так, это можно сделать с помощью рекурсивного CTE:
with input as (
select v.x
from (values ('a'), ('b'), ('c')) v(x)
),
cte as (
select cast(x as varchar(max)) as str, 1 as len
from input
union all
select cte.str + i.x, len + 1
from cte join
input i
on cte.str not like '%' + i.x + '%'
)
select top (1) with ties str
from cte
order by len desc;
Здесь - это скрипта SQL с этим решением.