2017-02-11 101 views
0

我想在不使用笛卡尔连接或交叉连接的情况下在两个表中输出所有可能的组合。这可能吗?替代笛卡尔和交叉连接

+6

所有可能的组合** **是一个笛卡尔积的定义。您可以使用显式交叉连接或隐式交叉连接,但结果将是相同的。 –

+1

----------为什么? ---------- –

+0

我可以在不使用交叉连接的情况下获得所有可能的组合吗?根据某人太昂贵。 – user7414008

回答

1

所有可能的组合是笛卡尔产品的定义

以下是从两个表中获得笛卡尔产品的3个替代方案。 所有3个方案最终归结为一个交叉连接(和执行计划是所有3相同):

创建和填充示例表:

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') 

的查询:

隐式交叉加盟:

SELECT * 
FROM t1, t2 

一个明确的交叉连接:

SELECT * 
FROM t1 
CROSS JOIN t2  

跨应用:

SELECT * 
FROM t1 
CROSS APPLY t2 

所有的结果都是一样的:

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 
1

我想输出无需使用笛卡尔两个表的所有可能的组合,连接或交叉连接。这可能吗?

由严格的定义级别,这是不可能的。为什么?因为笛卡尔积的定义正如你所描述的(术语“笛卡尔连接”不是经常使用,而是“笛卡尔积”的同义词)。因此,您使用的任何方法都是实现此功能。通常这个功能是使用CROSS JOIN(我不情愿地承认,有时使用,)来实现。

你可能会说“不加012地加1”而不做+ 1。其他人来了,并说“使用+ 2 - 1”。那么,这是增加一个,但只使用两个操作,而不是一个。

如果你想有一个笛卡尔乘积,但你不希望使用CROSS JOIN运营商,最典型的方法是使用ON 1=1

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