SQL动物园教程#10自我加入

时间:2015-12-29 02:43:26

标签: mysql sql join self-join

我是sql的初学者,并试图通过两次使用自联接来遵循提示但是失败了。

  

查找从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还有另一个答案,但我想知道哪一步出错了。非常感谢你!

2 个答案:

答案 0 :(得分:0)

离开我的头顶..如果这是你的SQL语句逐字,你需要删除**评论**。

答案 1 :(得分:0)

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)