【问题标题】:Error when trying to JOIN two derived tables尝试加入两个派生表时出错
【发布时间】:2015-02-12 01:37:32
【问题描述】:

我要疯了,试图找出这个错误。我在 MySQL 中工作,需要在一个公共列上加入两个派生表。两个表中的所有列都有别名。

方案是

stops (id, name)

route (num, company, pos, stop) 在哪里

stops.id route.stop

这些表包含城市之间的巴士路线,我想找出从“Craiglockhart”到“Sighthill”的所有路线,它们恰好需要两辆巴士(即一个换乘点)。此外,因为route 表不包含停靠点名称(只有ID),所以我们在派生表中使用一些连接来按名称引用停靠点;这只是一种方便)

所以我尝试制作两个派生表。可以在“Craiglockhart”和任何不是“Craighartlock”的车站和相同的第二个派生表但用于“Sighthill”的车站之间载人的所有路线之一。我能够让这两个表分别工作。

但是,当我尝试将它们沿所谓的中转站(即第一张表中的非 Craighartlock 站和第二张表中的非 Sighthill 站)的公共列加入时,我收到错误消息。

派生表 1:这可以正常工作并正确返回表。这里,stop_b.name 代表不是 Craiglockhart 的中转站,stop_a.name 代表 Craighill “起点”站。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route

派生表 2:相同但表别名和站点限制不同。这里stop_b.name代表中转站(不是Sighthill),stop_a.name代表Sighthill“终点”站。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route

但是,当我尝试将它们加入它们共同的 `name_transfer' 列(两者中的 stop_b.name 的别名)时,我收到一个错误:

SELECT * FROM
(
SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route
JOIN

(SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route)

ON (first_route.name_transfer = second_route.name_transfer)
)

我还尝试将ON 替换为USING (name_transfer),因为我要加入派生表的列在两个派生表中都称为该列。

任何帮助将不胜感激!

【问题讨论】:

  • 您需要在SELECT 后面加上括号JOIN
  • @Barmar:即使我在第二个大 SELECT 周围添加括号,我也会收到“每个派生表必须有一个别名”错误。在我上面的编辑中,我将新的右括号放在第二个派生表的别名之后,但如果我将它移到“AS second_route”之前,我会得到同样的错误。我需要为 JOIN 提供别名吗?那会在最后一个(主要)“ON”之后发生吗?
  • 您需要为新的SELECT 提供别名,例如JOIN (SELECT * ...) AS second_route。您在嵌套子查询中有别名,而不是您要加入的子查询。
  • 我不知道你为什么将那些 SELECT * 查询包裹在内部子查询周围。
  • SELECT * FROM (SELECT blah, blah ...)SELECT blah, blah, ... 相同

标签: mysql join inner-join


【解决方案1】:

当您在FROMJOIN 子句中使用子查询时,您需要在子查询周围加上括号。您在FROM 子句中有它,但在JOIN 子句中没有。当您在每个子查询周围添加不​​必要的 SELECT * FROM SELECT 时,问题似乎出现了。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route
JOIN

    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route

ON first_route.name_transfer = second_route.name_transfer

【讨论】:

  • 感谢您的帮助,但这仍然给我一个错误“接近”最后一个 ON。我完全尝试了你的代码....
  • 你能做一个 sqlfiddle 让我试试看吗?
  • 等等,纳米,它有效,我想我有一点错字。谢谢@Barmar!
【解决方案2】:

试试这个。

SELECT * FROM
    (SELECT * FROM 
        (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
                stop_b.name AS name_transfer FROM
                   route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                        JOIN stops stop_a ON (a.stop=stop_a.id)
                        JOIN stops stop_b ON (b.stop=stop_b.id)
                        WHERE stop_a.name = 'Craiglockhart' AND 
                              stop_b.name <> 'Craiglockhart') AS first_route) AS A
    JOIN

    (SELECT * FROM 
        (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
                stop_b.name AS name_transfer FROM
                   route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                        JOIN stops stop_a ON (a.stop=stop_a.id)
                        JOIN stops stop_b ON (b.stop=stop_b.id)
                        WHERE stop_a.name = 'Sighthill' AND 
                              stop_b.name <> 'Sighthill') AS second_route)B
    ON (A.name_transfer = B.name_transfer)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多