簡體   English   中英

如何連接兩個表(均源自自連接)以創建第三個表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM