![](/img/trans.png)
[英]How can I select data from two tables using an inner join and insert directly into a third table?
[英]How can I join two tables( both derived from self join) to create a third table?
我正在嘗試解決問題https://sqlzoo.net/wiki/Self_join ,self joins 問題編號 #10,具體說:
查找包含可從 Craiglockhart 到 Lochend 的兩輛巴士的路線。 顯示巴士號碼。 以及首班車的公司、換乘站的名稱和巴士號碼。 和公司的第二輛巴士。'。
我有我的代碼,不知何故它給了我錯誤說:
重復列名 'num'
這是我的代碼:
SELECT * FROM
(SELECT *
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 = 'Craiglockhart') big
/* [big] table Gives all buses from
craiglockhart */
JOIN
(SELECT *
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 = 'Lochend') small
/*[small] Gives all buses from Lochend */
ON big.b.stop = small.b.stop
/*Trying to join the two tables on the basis of
the matching values from [big].b.stop field with [small].b.stop */
我不確定這是否會產生預期的結果。 如果是這樣,這是一種有效的方法嗎? 如果沒有,有人可以幫我寫信並向我解釋它將如何工作,謝謝?
首先,你做了這個: ON a.company = b.company AND a.num = b.num
-> 它為列num
返回相同的值 - 所以它是重復的。
使用索引 - 例如: a.num
& b.num
:
SELECT a.num
FROM route a JOIN route b
ON a.company = b.company AND a.num = b.num
--OR
SELECT b.num
FROM route a JOIN route b
ON a.company = b.company AND a.num = b.num
ON big.b.stop = small.b.stop
也會拋出錯誤
正確答案:
SELECT DISTINCT x.num, x.company,x.name,y.num,y.company
FROM (
select a.num as num, a.company as company, stopb.name as 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 = 'Craiglockhart') x
JOIN
(select a.num as num, a.company as company, stopb.name as 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 = 'Lochend') y
ON x.name = y.name
ORDER BY x.num
這是一個被 sqlzoo 標記為“正確答案”的解決方案。
它的工作原理是首先選擇在 Craiglockhart 停止的所有線路,另一方面,選擇所有在 Lochend 停止的線路。 每個搜索都需要兩個 JOIN(停靠點 + 路線)。
最后,該查詢使用帶有 EXISTS 條件的特殊 JOIN 來定位屬於這兩行的所有停靠點。
SELECT
r1.num,
r1.company,
s3.name,
r2.num,
r2.company
FROM
stops s1
INNER JOIN route r1 ON r1.stop = s1.id
INNER JOIN stops s2 ON s2.name = 'Lochend'
INNER JOIN route r2 ON r2.stop = s2.id
INNER JOIN stops s3
ON EXISTS (
SELECT 1
FROM route
WHERE
num = r1.num
AND company = r1.company
AND stop = s3.id
)
AND EXISTS (
SELECT 1
FROM route
WHERE
num = r2.num
AND company = r2.company
AND stop = s3.id
)
WHERE
s1.name = 'Craiglockhart'
關於DUPLICATE COLUMN num
:
在自聯接的情況下,您有兩套列(包括列num
):一個來自route a
,另一個來自route b
(SELECT * -- double set of columns from table [route]
FROM route a JOIN route b
ON a.company = b.company AND a.num = b.num
您必須用字段名稱替換*
以忽略字段名稱的重復
例如
(SELECT a.*
FROM route a JOIN route b
ON a.company = b.company AND a.num = b.num
甚至更好 - 不要偷懶,按名稱寫下每個需要的字段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.