繁体   English   中英

了解多重自我加入

[英]understanding multiple self join

我在SQLZOO上练习自我加入,这对以下问题(Q10)我不了解:

两张桌子看起来像这样

问题是:查找涉及两条可以从Craiglockhart到Sighthill的巴士的路线。 显示巴士号码 第一辆巴士的公司和公司,中转站的名称以及巴士号 和公司第二辆公共汽车的答案是:

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,那么这里的联接标准是什么? 这种加入的结果是什么?

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

对于没有ON子句的这种类型的JOIN ,我们通常在JOIN之前包括CROSS关键字,以提醒以后的读者,忽略ON子句是有意的,而不是疏忽大意。

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

如果将ON expr指定为对每一行求值为true的表达式,则将得到相同的结果。

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

结果是一样的,如果我们省略了ON从整个条款等一行a分别从每一行比赛和b

在这种情况下,我倾向于忽略ON子句(在该子句中,表达式/条件始终为TRUE),而是指定CROSS JOIN 我认为这使意图更加明确。

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

在MySQL中,关键字INNERCROSS是可选的,并且没有影响。 也就是说, JOININNER JOINCROSS JOIN都是同义词。 因此,我们的使用方式是通过与其他数据库的兼容性来告知的,并谨记将来的读者可能会试图解读我们的陈述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM