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

Да, вы можете использовать angular.forEach для достижения этого.

Вот пример (если objects - массив):

// Define the initial promise
var sequence = $q.defer();
sequence.resolve();
sequence = sequence.promise;

angular.forEach(objects, function(val,key){
    sequence = sequence.then(function() {
        return doSomething(val);
    });
});

как это можно сделать, используя array.reduce, как и ответ @ friend00 (если objects - массив):

objects.reduce(function(p, val) {
    // The initial promise object
    if(p.then === undefined) {
        p.resolve(); 
        p = p.promise;
    }
    return p.then(function() {
        return doSomething(val);
    });
}, $q.defer());
29
задан ItamarG3 14 February 2018 в 18:49
поделиться

8 ответов

Принимая хотя бы 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
33
ответ дан Joe Stefanelli 14 February 2018 в 18:49
поделиться

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

select 
    distinct
    t1.Col1,
    t2.Col2
from 
    MyTable t1,
    MyTable t2
36
ответ дан Bob Black 14 February 2018 в 18:49
поделиться

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

SELECT a.Col1, b.Col2
FROM MyTable a
CROSS JOIN MyTable b
9
ответ дан JNK 14 February 2018 в 18:49
поделиться

Я искал что-то, что могло бы сделать это с использованием только 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
ответ дан Josh 14 February 2018 в 18:49
поделиться

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

Просто:

SELECT distinct Col1, Col2

FROM MyTable

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

4
ответ дан Casual user 14 February 2018 в 18:49
поделиться

Это использует 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
1
ответ дан Jamiec 14 February 2018 в 18:49
поделиться

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

;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
0
ответ дан RGH 14 February 2018 в 18:49
поделиться

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

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

. Проверьте свои комбинации. Кол-во (Кол-во строк) ]

0
ответ дан tinlyx 14 February 2018 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: