[英]Error when trying to JOIN two derived tables
我瘋了,試圖找出這個錯誤。 我在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)
)
我也嘗試用USING (name_transfer)
替換ON
,因為我要在兩個派生表中調用我想要加入派生表的列。
任何幫助將不勝感激!
在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.