Как мне вернуть список всех комбинаций значений в 2 столбца, чтобы они были новыми строками в T-SQL?
например
Col1, Col2
---- ----
1 2
1 4
1 5
и превратить это во все комбинации:
1 2
1 4
1 5
2 4
2 5
4 5
Как мне вернуть список всех комбинаций значений в 2 столбца, чтобы они были новыми строками в T-SQL?
например
Col1, Col2
---- ----
1 2
1 4
1 5
и превратить это во все комбинации:
1 2
1 4
1 5
2 4
2 5
4 5
Предполагая хотя бы SQL 2005 для CTE:
;with cteAllColumns as (
select col1 as col
from YourTable
union
select col2 as col
from YourTable
)
select c1.col, c2.col
from cteAllColumns c1
cross join cteAllColumns c2
where c1.col < c2.col
order by c1.col, c2.col
Вы можете cartesian присоединить таблицу к себе, которая вернет все комбинации обоих столбцов.
select
distinct
t1.Col1,
t2.Col2
from
MyTable t1,
MyTable t2
Вы можете сделать собственное крест-соединение...
SELECT a.Col1, b.Col2
FROM MyTable a
CROSS JOIN MyTable b
Я искал что-то, что сделало бы это, используя только SQL, доступный для Microsoft Access 2016. Я закончил тем, что выяснил, что другие могут пригодиться. Этот код использует CROSS JOIN, поэтому я обнаружил, что необходимо разбить два столбца на две отдельные таблицы (каждая с одним столбцом). Оператор AND заставляет один столбец быть меньше другого, тем самым устраняя повторяющиеся типы 1-2, 2-1.
SELECT DISTINCT Table1.Column1, Table2.Column1
FROM Table1, Table2
WHERE Table1.Column1 <> Table2.Column1
AND Table2.Column1 < Table1.Column1;
Я думаю, что это было слишком сложно! Просто:
SELECT distinct Col1, Col2
FROM MyTable
чтобы получить все возможные комбинации..
Это использует 2 cte, первый просто воспроизводит вашу входную таблицу, а второй превращает оба столбца в один столбец. Окончательный выбор перекрещивается с этим набором для создания требуемого выхода
with t(c1,c2)
AS
(
select 1,2
union select 1,4
union select 1,5
)
,t2(c)
as
(
select c1 from t
union select c2 from t
)
select t2_1.c, t2_2.c
from t2 t2_1
cross join t2 t2_2
where t2_1.c<t2_2.c
order by t2_1.c
Я нахожу внутреннее соединение более интуитивным, потому что я использую его чаще, чем перекрестное соединение:
;with cteAllColumns as (
select col1 as col
from YourTable
union
select col2 as col
from YourTable
)
select c1.col, c2.col
from cteAllColumns c1
join cteAllColumns c2 on 1=1
where c1.col < c2.col
order by c1.col, c2.col
Упрощение Joe Answer
declare @t1 table (col1 varchar(5))
insert @t1
select 'A' UNION
select 'B' UNION
select 'C'
declare @t2 table (col2 varchar(5))
insert @t2
select '1' UNION
select '2' UNION
select '3'
;with cteAllColumns as (
select col1 as col
from @t1
union
select col2 as col
from @t2
)
select c1.col, c2.col
from cteAllColumns c1
cross join cteAllColumns c2
where c1.col < c2.col
order by c1.col, c2.col
проверьте свои комбинации Qty (количество строк) http://www.calculatorsoup.com/calculators/discretemathematics/combinations.php