笛卡尔和交叉连接的替代方案

时间:2017-02-11 10:10:03

标签: sql sql-server sql-server-2008 sql-server-2012

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

  

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

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

您可能会说“在不执行+ 1的情况下将数字加1”。其他人出现并说“使用+ 2 - 1”。好吧,那就是添加一个,但只使用两个操作而不是一个。

如果您需要笛卡尔积,但又不想使用CROSS JOIN运算符,则最典型的方法使用ON 1=1

select t1.*, t2.*
from t1 join
     t2
     on 1 = 1;
相关问题