2013-02-13 3 views
0

열을 추가하고 각 행의 마지막 중지임을 나타내는 일부 행을 플래그하여 전송 일정 테이블을 개선하려고합니다.업데이트를 수행하는 SQLITE 구문 오류

각 여행에는 여행을 따라 정류장과 순서가 표시된 많은 행이 있습니다. 순서 번호가 해당 여행에 대해 가장 높은 경우 LastStop 열을 '1'로 업데이트하려고합니다.

다음 SQL은 올바른 경로에 있다고 생각하지만 "no such column : s1.stop_sequence"가 표시되므로 잘 모르는 사이에 오류가 해결 될 때까지 올바른 트랙에 있는지도 모릅니다. . 나는 거의 초보자 수준을 초월한 SQL 경량급이다. Stop_Sequence는 확실히 정확한 열 이름입니다.

UPDATE stop_times 
    SET LastStop = '1' 
WHERE stop_sequence =(
      SELECT max(st.stop_sequence) 
      FROM stop_times s1 
      WHERE s1.trip_id = trip_id 
     ) 
     AND 
     trip_id = s1.trip_id 
     AND 
     stop_ID = s1.stop_id; 

샘플 데이터의 단순화 된 버전은 아래와 같습니다.

TripID Stop Sequence LastStop 
665381 1766 1 
665381 3037 2 
665381 3038 3   1 
667475 1130 1 
667475 2504 2   1 
644501 2545 1 
644501 3068 2 
644501 2754 3 
644501 3069 4 
644501 2755 5   1 
+0

쿼리와 샘플 데이터의 열 이름이 일치하지 않습니다. 앨리어스가's1' 또는'st'입니까? –

답변

0

외부 쿼리에서 하위 쿼리의 열을 참조 할 수 없습니다. 또한 trip_id = s1.trip_id 필터가 중복되어 있으므로 stop_id을 필터링하지 않으려면 MAX이 다른 여행 중지 지점을 보지 못하도록 차단해야합니다.

이 시도 :

UPDATE stop_times 
SET LastStop = '1' 
WHERE NOT EXISTS (SELECT 1 
        FROM Stop_Sequence s1 
        WHERE s1.Trip_ID = stop_times.Trip_ID 
        AND s1.Stop_Sequence > stop_times.Stop_Sequence) 
0

이 당신을 위해 작동합니다

UPDATE stop_times 
SET LastStop = '1' 
WHERE Stop_Sequence = (SELECT MAX(Stop_Sequence) 
         FROM stop_times s1 
         WHERE s1.Trip_ID = stop_times.Trip_ID) 

을 다른 방법으로는, 종점이 같은 여행에 더 큰 시퀀스 번호가 다른 정지가 존재하지 않는위한 정지이다 , 멈춤 필드가 항상 1000보다 작 으면 (더 큰 배수를 사용하십시오) :

UPDATE stop_times 
SET laststop = 1 
WHERE tripid*1000+sequence IN (
    SELECT tripid*1000+sequence FROM (
     SELECT tripid, max(sequence) AS sequence 
     FROM stop_times 
     GROUP BY 1 
    ) 
) 

I wou LD이 사용 튜플 구문을 작성하지,하지만 SQLite는이를 지원하지 않습니다

UPDATE stop_times 
SET laststop = 1 
WHERE (tripid, sequence) IN (
    SELECT (tripid, sequence) FROM (
     SELECT tripid, max(sequence) AS sequence 
     FROM stop_times 
     GROUP BY 1 
    ) 
) 

는 죄송합니다 SQLFiddle을 - 오늘 나를 위해 작동하지 않는 것 같습니다.