gpt4 book ai didi

mysql - 理解多重自连接

转载 作者:行者123 更新时间:2023-11-29 05:55:45 24 4
gpt4 key购买 nike

我在 SQLZOO 练习自连接对于以下问题(Q10),我有一点不明白:

Two tables look like this

问题是:查找涉及从 Craiglockhart 到 Sighthill 的两辆公共(public)汽车的路线。显示公交车号和第一辆公共(public)汽车的公司,换乘站的名称,和公共(public)汽车号和第二辆公共(public)汽车的公司答案是:

SELECT DISTINCT a.num, a.company, stopb.name ,  c.num,  c.company
FROM route as a JOIN route as b
ON (a.company = b.company AND a.num = b.num)
JOIN ( route c JOIN route d ON (c.company = d.company AND c.num= d.num))
JOIN stops as stopa ON (a.stop = stopa.id)
JOIN stops as stopb ON (b.stop = stopb.id)
JOIN stops as stopc ON (c.stop = stopc.id)
JOIN stops as stopd ON (d.stop = stopd.id)
WHERE stopa.name = 'Craiglockhart' AND stopd.name = 'Sighthill'
AND stopb.name = stopc.name
ORDER BY LENGTH(a. num), b.num, stopb.id, LENGTH(c.num), d.num

我对结果很困惑

FROM route a JOIN route b ON (a.company = b.company AND a.num = b.num)
JOIN ( route c JOIN route d ON (c.company = d.company AND c.num= d.num))

第二个JOIN不包含ON,那么这里的join条件是什么?这次加入的结果是什么?

最佳答案

结果是叉积。左边的每一行都与右边的每一行相匹配。

对于这种没有 ON 子句的连接,我们通常在 JOIN 之前包含 CROSS 关键字,以提醒 future 的读者省略 ON 子句是有意的,而不是疏忽。

SELECT ...
FROM a
CROSS
JOIN b
ORDER BY ...

如果我们指定 ON expr 并为每一行求值为真,我们会得到相同的结果。

SELECT ...
FROM a
JOIN b
ON 1=1
ORDER BY ...

结果就好像我们完全省略了 ON 子句一样……a 中的一行匹配 b 中的每一行>。

在这种情况下,我倾向于省略 ON 子句(其中表达式/条件的计算结果始终为 TRUE)并改为指定 CROSS JOIN。我认为这使意图更加明确。

MySQL 比其他一些数据库更自由,后者在省略 ON 子句时需要 CROSS 关键字。

在MySQL中,关键字INNERCROSS是可选的,没有影响。也就是说,JOININNER JOIN 以及CROSS JOIN 都是同义词。因此,我们的使用风格取决于与其他数据库的兼容性,并注意 future 可能试图破译我们声明的读者。

关于mysql - 理解多重自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49594070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com