3 回答
TA贡献1810条经验 获得超5个赞
交叉联接产生的结果由两个或多个表中的行的每种组合组成。这意味着如果表A有6行,表B有3行,则交叉连接将导致18行。在两个表之间没有建立关系-实际上,您只是产生每种可能的组合。
通过内部联接,将表的一行的列值与另一(或同一)表的另一行的列值组合在一起,以形成单行数据。
如果将WHERE子句添加到交叉联接中,则由于WHERE施加了限制因素,因此它充当内部联接。
只要您的查询遵守常识和特定于供应商的性能准则,我就认为将使用哪种类型的连接的决定简单地考虑进去。
TA贡献1895条经验 获得超7个赞
我发现,允许第一种语法(用逗号分隔的表)的工作场所往往会花费大量时间来调试情况,这些情况下返回的行比预期的多。意外的交叉联接是系统的祸根,甚至可以使最优化的数据库瘫痪。去年,它至少使我们的pre-prod系统停止了两次。
第二种语法(联接语法)迫使编写者首先考虑如何将表联接在一起,然后仅返回感兴趣的行。使用该语法意外地进行交叉联接是不可能的,因此减少了意外地执行不良查询的危险。
但是,除了这个问题之外,我从来没有注意到我所拥有的任何系统中两种语法之间的速度差异。
TA贡献1796条经验 获得超7个赞
第一个示例在功能上与第二个示例相同。但是,出于多种原因,应避免使用此语法。首先,使用这种语法时,意外地获得交叉联接要容易得多,尤其是当表中存在多个联接时。如果您看到很多这种类型的查询都带有关键字“ distinct”,则可能有人试图修复交叉连接。
接下来,不赞成使用较旧样式的左右联接语法,并且将不再支持该语法。此外,它现在仍然无法正常工作。有时,它会误解外部联接并发回错误的结果集。因此,您在where子句中使用=或=的所有查询都应立即替换。
第三,ANSI标准联接更易于理解和维护。对联接的理解是任何查询任何关系数据库所需的最关键的基本技能之一。我的经验是,一些使用较旧样式的人并不真正理解联接及其工作方式,因此编写的查询实际上并没有达到他们的预期目的。
添加回答
举报