두 개의 테이블(둘 다 자기 결합에서 파생됨)을 결합하여 세 번째 테이블을 만들려면 어떻게 해야 합니까?
저는 https://sqlzoo.net/wiki/Self_join, self가 질문 번호 10에 참여하는 문제를 해결하려고 합니다.구체적으로는 다음과 같습니다.
크레이그록하트에서 로켄드로 가는 버스 두 대가 있는 경로를 찾으십시오.첫 번째 버스는 회사, 환승 정류장 이름, 두 번째 버스는 회사 번호를 표시하라.'
코드가 있는데, 다음과 같은 에러가 발생하고 있습니다.
열 이름 '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
- 그럼 복제품인 거군요
인덱스 사용 - exmaple: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에 정차하는 모든 노선과 Locend에 정차하는 모든 노선을 선택합니다.각 검색에는 2개의 JOIN(Stops + route)
마지막으로 쿼리는 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
): 1개부터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
또는 더 나은 - 게으르지 말고 필요한 각 필드를 이름으로 작성하십시오.
언급URL : https://stackoverflow.com/questions/54409519/how-can-i-join-two-tables-both-derived-from-self-join-to-create-a-third-table
'source' 카테고리의 다른 글
메모화는 무엇이며 Python에서는 어떻게 사용할 수 있습니까? (0) | 2022.11.19 |
---|---|
명령줄을 사용하여 단일 테이블을 mysql 데이터베이스로 Import하는 방법 (0) | 2022.11.19 |
JavaScript에서 세트를 매핑/축소/필터링하는 방법 (0) | 2022.11.19 |
Google Finance API를 사용하여 주식 시세를 얻으려면 어떻게 해야 합니다. (0) | 2022.11.19 |
php가 비어있을 때 null입니까? (0) | 2022.11.19 |