Вернуть все возможные комбинации значений по столбцам в SQL - PullRequest
29 голосов
/ 07 декабря 2010

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

например

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

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

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

Ответы [ 8 ]

36 голосов
/ 07 декабря 2010

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

select 
    distinct
    t1.Col1,
    t2.Col2
from 
    MyTable t1,
    MyTable t2
33 голосов
/ 07 декабря 2010

Предполагается, что по крайней мере 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
9 голосов
/ 07 декабря 2010

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

SELECT a.Col1, b.Col2
FROM MyTable a
CROSS JOIN MyTable b
5 голосов
/ 31 мая 2017

Я искал что-то, что могло бы сделать это с использованием только 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;
4 голосов
/ 28 февраля 2017

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

Просто:

SELECT distinct Col1, Col2

FROM MyTable

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

1 голос
/ 07 декабря 2010

Это использует 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
0 голосов
/ 12 января 2017

Облегчение ответа Джо

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

проверьте ваши комбинации Кол-во (Кол-во строк) http://www.calculatorsoup.com/calculators/discretemathematics/combinations.php

0 голосов
/ 26 июня 2015

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

;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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...