为什么以及何时使用CROSS JOIN而不是INNER JOIN和UPDATE语句?

时间:2013-04-17 12:46:03

标签: sql sql-server tsql

在T-Sql中进行编码,因为有三个左右,我刚刚看到在某些代码中CROSS JOIN语句中第一次使用UPDATE而我无法找出这种结构的用例。

有人知道吗?

编辑:这是我无法理解的示例代码。

UPDATE a
SET a.COL1 = b.COL1
FROM Table1 AS a
CROSS JOIN Table2 AS b

代码中还有其他更新提供了WHERE子句,如:

UPDATE a
SET a.COL1 = b.COL1
FROM Table1 AS a
CROSS JOIN Table2 AS b
WHERE condition_on_columns_from_a_and_from_b

关键是,对于Table1的每一行,使用过滤的交叉连接上的选择将返回多行。

我对行为的理解有点困惑。

PS:Table1表占用超过5千兆字节的空间..

4 个答案:

答案 0 :(得分:2)

交叉连接生成两个表的笛卡尔积。这意味着它将表A的每一行与表B的每一行组合。当表A有n行而表B有m行时,结果集有n * m行。

答案 1 :(得分:2)

我无法想象这样做。查询要么写得不正确,要么只是一个测试来减慢系统速度或使目标表的数据无效(或者只是为了查看它的作用)。

它可能会将Table1中每一行的COL1设置为Table2的COL1中相同的单个随机值(尽管可能是第一个或最后一个这样的值)。但它会非常效率低下(除非SQL Server的更高版本中的优化器已经优化了这个无用的情况,我自己多年没有测试过它。)

答案 2 :(得分:0)

要了解用例,您需要查看数据。我可以很容易地看到使用第一次更新,如果我是积极的tableb将始终只包含一个记录。尤其如此,一条记录没有要加入表A的字段。在这种情况下,您将使用表b中该字段的值更新表a中的所有字段。通常这种类型的事情,其中​​所有记录都被更新,仅用于重置值。

要查看要更新的内容,请执行以下操作:

UPDATE a
SET a.COL1 = b.COL1
--select a.COL1,b.COL1, *
FROM Table1 AS a
CROSS JOIN Table2 AS b
WHERE condition_on_columns_from_a_and_from_b

现在你可以只运行select部分来查看a.col1将被替换的值,并查看表中的其他字段以查看join和where clasue是否正确。这将有助于您了解corss加入的内容。然后,你可以暂时用左连接和内连接替换交叉连接,以了解它具有的行为与其他类型的连接不同。选择一段时间,直到你真正了解正在发生的事情。我没有在评论中没有选择的情况下编写更新,所以我可以确保在将代码移动到prod之前更新我认为应该是的内容。如果您编写像我这样的复杂更新,这可能涉及十个或十五个连接以及几个条件的情况,这是非常正确的。

答案 3 :(得分:0)

好的,有了这个查询:

UPDATE a
SET COL1 = b.COL1
FROM Table1 AS a
CROSS JOIN Table2 AS b
WHERE condition_on_columns_from_a_and_from_b

如果我们采用由a CROSS JOIN b形成的集合(并且在考虑FROM子句之前),那么我们有一个笛卡尔积,其中a的每一行都与来自的每一行配对b

如果我们现在考虑WHERE子句 - 除非这个WHERE子句足以保证来自a的每一行只表示一次,那么我们将有一个不确定的结果。也就是说,如果集合中有两行都来自a的同一行(但是来自b的不同行),那么肯定无法知道哪一行这两行将用于计算SET a.COL1 = b.COL1赋值。

如果我们有以下内容,我认为它甚至不会得到保证:

UPDATE a
SET COL1 = b.COL1, COL2 = b.COL2
FROM --As before

来自b相同行将用于这两项作业。

以上所有内容都适用于使用T-SQL UPDATE子句扩展的任何 FROM语句 - 除非您小心限制您的连接条件,然后多个同一行的分配是可能的。但CROSS JOIN似乎更容易发生。如果发生这种情况,SQL Server会发出 no 诊断消息。