2017-02-08 1 views
0

나는 내 문제가 어디 있는지 알고 있지만 어떻게 해결해야할지 확신하지 못합니다. 출발지와 도착지가 다른 여행을 찾으려고합니다. 그러나 코드를 작성한 방식에 따라 출발지와 도착 위치가 같은 세트 만 반환합니다. 이 문제를 어떻게 해결할 수 있습니까? 보스턴에서 출발하여 나소에 도착하는 여행을 찾고 싶습니다. 여행과 같은 코드를 사용하지 마십시오.mysql 코드가 빈 세트를 반환합니다

SELECT name 
    FROM staff, trip, locations 
    WHERE trip.TripNum = staff.TripNum AND staff.DATE = trip.DATE AND trip.DATE = '2015-08-14' 
    AND (trip.ArrivalLocCode = locations.LocationCode AND locations.Location = "Nassau") 
    AND (trip.DepartureLocCode = locations.LocationCode And locations.Location = "Boston"); 

답변

3

먼저 DepartureLocCode = "BOS"다음 FROM 절에 결코 사용 쉼표. 항상은 적절하고 명시적인 JOIN 구문을 사용합니다. SQL을 배우면 특히 그렇습니다. 당신은 다음과 같이 두 번 위치 테이블에 가입해야

SELECT name 
FROM staff s JOIN 
    trip t 
    ON t.TripNum = s.TripNum JOIN 
    locations la 
    ON t.ArrivalLocCode = la.LocationCode JOIN 
    locations ld 
    ON t.DepartureLocCode = ld.LocationCode 
WHERE t.DATE = '2015-08-14' AND 
     la.Location = 'Nassau' AND 
     ld.Location = 'Boston'; 
+0

이것은 매우 유용했습니다. 나는 당신 덕분에 JOIN을 사용하는 것의 중요성을 배웠습니다. 고맙습니다. 대단히 감사합니다. –

1

:

당신의 가장 큰 문제는, 그러나, 당신은 두 개의 조인을 필요로한다는 것입니다. (나는 현대 명시 적 JOIN 문법을 사용했다)

SELECT name 
FROM staff s 
inner join trip t on t.TripNum = s.TripNum AND s.DATE = t.DATE 
inner join locations l1 on t.ArrivalLocCode = l1.LocationCode 
inner join locations l2 on t.DepartureLocCode = l2.LocationCode 
WHERE t.DATE = '2015-08-14' 
AND l1.Location = 'Nassau' 
AND l2.Location = 'Boston'; 
1

위치 테이블에 두 번 가입해야한다.

저는 암시 적 조인 팬이 아니므로 IMHO 가독성을 방해하므로 조인을 명시 적으로 적용했습니다.

SELECT name 
FROM staff s 
JOIN trip t ON t.TripNum = staff.TripNum 
JOIN locations l1 ON t.ArrivalLocCode = l1.locationCode 
JOIN locations l2 ON t.DepartureLocCode = l2.locationCode 
WHERE s.DATE = t.DATE 
AND t.DATE = '2015-08-14' 
AND l1.location = 'Nassau' 
AND l2.location = 'Boston' 
관련 문제