Подтвердить что ты не робот

Возвращать все возможные комбинации значений в столбцах в SQL

Как мне вернуть список всех комбинаций значений в 2 столбца, чтобы они были новыми строками в T-SQL?

например

Col1, Col2
----  ----
1     2
1     4
1     5

и превратить это во все комбинации:

1     2
1     4
1     5
2     4
2     5
4     5
4b9b3361

Ответ 1

Предполагая хотя бы 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

Ответ 2

Вы можете cartesian присоединить таблицу к себе, которая вернет все комбинации обоих столбцов.

select 
    distinct
    t1.Col1,
    t2.Col2
from 
    MyTable t1,
    MyTable t2

Ответ 3

Вы можете сделать собственное крест-соединение...

SELECT a.Col1, b.Col2
FROM MyTable a
CROSS JOIN MyTable b

Ответ 4

Я искал что-то, что сделало бы это, используя только 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;

Ответ 5

Я думаю, что это было слишком сложно! Просто:

SELECT distinct Col1, Col2
FROM MyTable

чтобы получить все возможные комбинации..

Ответ 6

Это использует 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

Ответ 7

Я нахожу внутреннее соединение более интуитивным, потому что я использую его чаще, чем перекрестное соединение:

;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

Ответ 8

Упрощение 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