尝试 JOIN 两个派生表时出错
Error when trying to JOIN two derived tables
我正在努力找出这个错误。我在 MySQL 工作,需要在公共列上连接两个派生的 table。两个 table 中的所有列都带有别名,table 也是如此。
方案是
stops (id, name)
route (num, company, pos, stop)
其中
stops.id
<---> route.stop
这些table包含城市之间的公交路线,我想找出从'Craiglockhart'到'Sighthill'的所有路线,正好需要两辆公交车(即一个中转站) .此外,因为 route
table 不包含站点名称(仅 ID),我们在派生的 table 中使用一些连接来按名称引用站点;这只是为了方便)
所以我尝试制作两个派生的table。可以在 'Craiglockhart' 和任何非 'Craighartlock' 站之间的所有路线之一,以及 table 的第二个派生站,但 'Sighthill'。我能够让这两个 table 分开工作。
但是,当我试图沿着所谓的中转站(即第一个非 Craighartlock 站 table 和第二个非 Sighthill 站)的公共栏加入他们时,我得到一个错误。
Derived Table 1:这工作正常并且 returns table 正确。此处,stop_b.name
表示非 Craiglockhart 的中转站,stop_a.name
表示 Craighill "starting" 站。
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
派生 Table 2:相同但不同 table 别名和站点限制。这里stop_b.name
代表中转站(不是Sighthill),stop_a.name
代表Sighthill"ending"站。
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)
)
我也尝试用 USING (name_transfer)
替换 ON
因为我想加入派生的 tables 的列在两个派生的 tables 中都被调用.
如有任何帮助,我们将不胜感激!
当您在 FROM
或 JOIN
子句中使用子查询时,您需要在子查询两边加上括号。您在 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
试试这个。
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)
我正在努力找出这个错误。我在 MySQL 工作,需要在公共列上连接两个派生的 table。两个 table 中的所有列都带有别名,table 也是如此。
方案是
stops (id, name)
route (num, company, pos, stop)
其中
stops.id
<---> route.stop
这些table包含城市之间的公交路线,我想找出从'Craiglockhart'到'Sighthill'的所有路线,正好需要两辆公交车(即一个中转站) .此外,因为 route
table 不包含站点名称(仅 ID),我们在派生的 table 中使用一些连接来按名称引用站点;这只是为了方便)
所以我尝试制作两个派生的table。可以在 'Craiglockhart' 和任何非 'Craighartlock' 站之间的所有路线之一,以及 table 的第二个派生站,但 'Sighthill'。我能够让这两个 table 分开工作。
但是,当我试图沿着所谓的中转站(即第一个非 Craighartlock 站 table 和第二个非 Sighthill 站)的公共栏加入他们时,我得到一个错误。
Derived Table 1:这工作正常并且 returns table 正确。此处,stop_b.name
表示非 Craiglockhart 的中转站,stop_a.name
表示 Craighill "starting" 站。
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
派生 Table 2:相同但不同 table 别名和站点限制。这里stop_b.name
代表中转站(不是Sighthill),stop_a.name
代表Sighthill"ending"站。
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)
)
我也尝试用 USING (name_transfer)
替换 ON
因为我想加入派生的 tables 的列在两个派生的 tables 中都被调用.
如有任何帮助,我们将不胜感激!
当您在 FROM
或 JOIN
子句中使用子查询时,您需要在子查询两边加上括号。您在 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
试试这个。
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)