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