'Alternative for Cartesian and Cross Join

I want to output all the possible combination in two tables without using cartesian join or cross join. Is this possible?



Solution 1:[1]

I want to output all the possible combination in two tables without using cartesian join or cross join. Is this possible?

By a strict definition level, it is not possible. Why? Because the definition of a Cartesian product is exactly what you describe (the term "Cartesian join" is not often used but is a synonym for "Cartesian product"). Hence, any method that you use is implementing this functionality. Normally this functionality is implementing using CROSS JOIN (and I reluctantly admit, sometimes using ,).

You might say "add 1 to a number without doing + 1". Someone else comes along and says "use + 2 - 1". Well, that is adding one, but just using two operations rather than one.

If you want a Cartesian product but you don't want to use the CROSS JOIN operator, the most typical method uses ON 1=1:

select t1.*, t2.*
from t1 join
     t2
     on 1 = 1;

Solution 2:[2]

All possible combinations is the definition of a cartesian product.

Here are 3 alternatives to get a cartesian product from two tables. All 3 alternatives eventually boils down to a cross join (and execution plan is the same for all 3):

Create and populate sample tables:

CREATE TABLE t1 
(
    int_col int
)

CREATE TABLE t2
(
    char_col char(1)
)

INSERT INTO t1 VALUES 
(1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

INSERT INTO t2 VALUES 
('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('h'), ('i'), ('j'), ('k')

The queries:

An implicit cross join:

SELECT *
FROM t1, t2

An explicit cross join:

SELECT *
FROM t1
CROSS JOIN t2    

Cross apply:

SELECT *
FROM t1
CROSS APPLY t2

All results are the same:

int_col     char_col
1           a
2           a
3           a
4           a
5           a
6           a
7           a
8           a
9           a
10          a
1           b
2           b
3           b
4           b
5           b
6           b
7           b
8           b
9           b
10          b
1           c
2           c
3           c
4           c
5           c
6           c
7           c
8           c
9           c
10          c
1           d
2           d
3           d
4           d
5           d
6           d
7           d
8           d
9           d
10          d
1           e
2           e
3           e
4           e
5           e
6           e
7           e
8           e
9           e
10          e
1           f
2           f
3           f
4           f
5           f
6           f
7           f
8           f
9           f
10          f
1           h
2           h
3           h
4           h
5           h
6           h
7           h
8           h
9           h
10          h
1           i
2           i
3           i
4           i
5           i
6           i
7           i
8           i
9           i
10          i
1           j
2           j
3           j
4           j
5           j
6           j
7           j
8           j
9           j
10          j
1           k
2           k
3           k
4           k
5           k
6           k
7           k
8           k
9           k
10          k

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2