【问题标题】:SQL zoo tutorial #10 Self JoinSQL zoo 教程#10 自加入
【发布时间】:2015-12-29 02:43:25
【问题描述】:

我是 sql 初学者,尝试按照提示使用 self join 两次但失败了。

查找涉及两辆可以从 Craiglockhart 到 Sighthill 的巴士的路线。 显示巴士号码。第一班车的公司,换乘站点的名称, 和巴士号码。和公司的第二辆公共汽车。 提示:自行加入两次以查找访问 Craiglockhart 和 Sighthill 的巴士,然后加入匹配站点的巴士。

我的代码:

select 
    a.num, a.company, stopsc.name, c.num, c.company 
from 
    route a 
    join route b 
    on (a.num=b.num and a.company=b.company) **From Craiglockhart to the transfer stop**
    join route c 
    on (b.stop=c.stop) **to connect the transfer stop**
    join route d 
    on (c.num=d.num and c.company=d.company) **From transfer stop to the final stop which is Sighthill**
    join stops stopsa 
    on (a.stop=stopsa.id)
    join stops stopsb 
    on (b.stop=stopsb.id)
    join stops stopsc 
    on (c.stop=stopsc.id)
    join stops stopsd 
    on (d.stop=stopsd.id)
where 
    stopsa.name='Craiglockhart' 
and stopsd.name='Sighthill' 
and a.num!=c.num **to delete the same route**
order by a.num

请告诉我我的回答有什么逻辑错误。我知道sqlselfjoin 上还有另一个答案,但我想知道我在哪一步出错了。非常感谢!

【问题讨论】:

标签: mysql sql join self-join


【解决方案1】:

在我的脑海中..如果那是您的 SQL 语句逐字记录,您需要删除 ** 注释 ** 的。

【讨论】:

    【解决方案2】:
    and a.num!=c.num
    

    使用此代码,我假设您正在尝试删除任何可能的 1-bus 行程。 这行代码有两个主要问题。

    1) 您正在阻止加入具有相同总线# 的可能不同的公司。 (虽然在这个问题中,这个逻辑错误没有任何区别)

    2) 虽然您确实删除了任何可能的 1-bus 行程(没有转乘巴士),但您并没有删除重复项。 (顺便说一句,在这个 Q 中,不可能有 1 辆巴士带您到目的地 :D)

    有重复的原因是某些公交线路有重复的行。例如,如果您执行以下代码,您将看到重复项。 (对于给定的公交线路,同一站点的多个入口)

      SELECT a.company, a.num, stopa.name, stopb.name
      FROM route a JOIN route b ON
      (a.company=b.company AND a.num=b.num)
      JOIN stops stopa ON (a.stop=stopa.id)
      JOIN stops stopb ON (b.stop=stopb.id)
      WHERE stopa.name='London Road' AND a.num=35
    

    因此,要删除重复项,您应该写在代码的顶部

    select distinct
    a.num, a.company, stopsc.name, c.num, c.company 
    

    最后,网站上有一个排序错误,其中 num 没有被正确地视为整数,从而给你错误的答案。因此,输入此代码,您将得到“正确答案”

    order by CAST(a.num as int)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2012-08-28
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多