我如何理解 join 语句中出现的逗号?

Posted

技术标签:

【中文标题】我如何理解 join 语句中出现的逗号?【英文标题】:How do I understand the commas happening in join statements? 【发布时间】:2021-03-07 02:48:13 【问题描述】:

我遇到了一个传奇的代码,并且一直在努力用更简单的术语来分解它。传说中的代码完美运行。我正在复制代码的连接部分,为简洁起见不包括选择。我对连接非常熟悉,但我想专注于两个部分

1.) FROM COURSE c, GRADE g 这试图达到什么目的?它怎么知道怎么做?

2.) 当这些表在内部连接发生后用逗号列出时,GRADEITEM gs, STUDENT s, SECTION sec 有什么作用?这三个表表我是不是漏掉了一个?

FROM COURSE c, GRADE g 
INNER JOIN CEC cc 
ON g.SectionID = cc.SectionID AND g.StudentID = cc.StudentID, GRADEITEM gs, STUDENT s, SECTION sec

【问题讨论】:

逗号对应于 1989 年的连接语法(也就是旧的连接语法)。 1992 年定义了JOIN 子句。我建议永远不要混合新旧语法。这很模糊,并非所有开发人员都了解混合它们的后果。远离这种组合。 “传奇密码”我将不得不使用它 @JohnWu 我希望有一天我能写出传奇代码。 ;-) @JohnWu 我使用传奇代码是因为它在我们公司“非常知名”,不一定具有伟大的内涵 LOL 我猜您正在寻找的术语是“遗留代码”。 【参考方案1】:

这段代码:

FROM COURSE c,
     GRADE g INNER JOIN
     CEC cc 
     ON g.SectionID = cc.SectionID AND g.StudentID = cc.StudentID, GRADEITEM gs,
     STUDENT s,
     SECTION sec

非常神秘(就像“传奇”一样,是一种表达我真实想法的礼貌方式)。

这相当于:

FROM COURSE c
     GRADE g
     ON g.StudentID = cc.StudentID INNER JOIN
     CEC cc 
     ON g.SectionID = cc.SectionID CROSS JOIN
     GRADEITEM gs CROSS JOIN
     STUDENT s CROSS JOIN
     SECTION sec

逗号基本上表示CROSS JOIN。我通过拆分ON 子句将第一个CROSS JOIN 重写为预期的JOIN

其余的只是笛卡尔积。我想WHERE 子句提供了更多的过滤功能。

“Arcane”和“archaic”是描述代码的礼貌方式。这是写得很糟糕的代码。如果打算使用笛卡尔积,则CROSS JOIN 是合适的。也就是说,我很确定 JOINs 适用于所有表——任何有用的查询。

【讨论】:

我应该将 Legendary 替换为 Legacy 代码以给出适当的情绪。我将这个传奇的问题定义为对我的团队来说非常令人难忘的元素,而不是真正考虑到伟大的元素哈哈。交叉连接是否仅发生在列中具有准确拼写的列? @Brandon 。 . . cross join 不引用列。它是笛卡尔积,因此它将一个表中的每一行与另一个表中的每一行匹配。注意:以英语为母语的人知道“传奇”并不是您的意思。我猜大家都被这个词的使用逗乐了;它是非常原始的。

以上是关于我如何理解 join 语句中出现的逗号?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript,IF 语句中的逗号 - 试图理解这段代码

如何在打印语句中的变量旁边添加逗号和句点

mysql from 逗号 是join的简写吗

JavaScript 逗号运算符

如何在光标的 select 语句 where 子句中传递逗号分隔值

从 C# 中的列表创建逗号分隔列表而不终止逗号