我如何理解 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
是合适的。也就是说,我很确定 JOIN
s 适用于所有表——任何有用的查询。
【讨论】:
我应该将 Legendary 替换为 Legacy 代码以给出适当的情绪。我将这个传奇的问题定义为对我的团队来说非常令人难忘的元素,而不是真正考虑到伟大的元素哈哈。交叉连接是否仅发生在列中具有准确拼写的列? @Brandon 。 . .cross join
不引用列。它是笛卡尔积,因此它将一个表中的每一行与另一个表中的每一行匹配。注意:以英语为母语的人知道“传奇”并不是您的意思。我猜大家都被这个词的使用逗乐了;它是非常原始的。以上是关于我如何理解 join 语句中出现的逗号?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript,IF 语句中的逗号 - 试图理解这段代码