在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千兆字节的空间..
答案 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 诊断消息。