>

승객 항공편에 대한 정보가있는 MySQL 데이터베이스에 테이블이 있습니다. 비행 지연에 대한 분석을하고 싶습니다. 동일한 항공사가 현재 행의 출발 공항에 도착한 항공편이 지난 24 시간 동안 지연된 횟수를 나타내는 계산 된 속성을 각 행에 추가하고 싶습니다.

이 쿼리를 작성하는 데 운이 없었습니다. 내 의도를 다음과 같이 표현할 수 있다고 생각합니다.

-- Find a count of all rows
    count(*) where
-- Of the same carrier 
    a.FlightCarrier = thisRow.FlightCarrier
-- that arrived at our departure airport
    a.DestinationAirport = thisRow.OriginAirport
-- scheduled to arrive before ScheduledDepartureTimeUTC
    a.ScheduledArrivalTimeUTC < thisRow.ScheduledDepartureTimeUTC
-- scheduled to arrive after (ScheduledDepartureTimeUTC - 24h)
    a.ScheduledArrivalTimeUTC > (thisRow.ScheduledDepartureTimeUTC - 24h)
-- had a delayed arrival
    a.DelayedArrival = 1

이 문장을 SQL 문으로 쓰려고했습니다 :

alter table flight add column DelayedCarrierArrivals24H int as
(select count(*) from flight a where 
 a.FlightCarrier = FlightCarrier
 and a.DestinationAirport = OriginAirport
 and a.ScheduledArrivalTimeUTC < ScheduledDepartureTimeUTC
 and a.ScheduledArrivalTimeUTC > (ScheduledDepartureTimeUTC - (60 * 60 * 24))
 and a.DelayedArrival = 1) STORED;

그러나 MySQL은 "SQL 구문에 오류가 있습니다. a.FlightCarrier = FlightCarrier = a 항공편에서 'select count (*) 근처에 오류가 있습니다.'

MySQL에서이 칼럼을 만드는 '올바른'방법은 무엇입니까? 원래 창 기능을 사용하려고했지만 이러한 기능을 사용하여 의도를 표현할 수있는 올바른 방법을 찾지 못했습니다.

  • 답변 # 1

    문제

    https : //dev.mysql .com/doc/refman/5.7/en/create-table-generated-columns.html :

    와이즈 비즈

    식에 하위 쿼리가 포함되어 있습니다. 오류 메시지는 하위 쿼리를 직접 가리 켰습니다. "... near 'select ..."

    생성 된 열은 다소 제한적입니다 (좋은 이유로).

    제안 1

    테이블에서 데이터를 가져올 때 계산을 수행하는 것이 좋습니다.

    Generated column expressions must adhere to the following rules. An error occurs if an expression contains disallowed constructs.

    ...

    Subqueries, parameters, variables, stored functions, and user-defined functions are not permitted.

    ...

    작성을 고려하십시오  발신자에게 숨기려면 저장 루틴을 사용하십시오.

    제안 2

    아마이게 당신이 찾고있는 것에 더 가깝습니까?

    VIEW
    
    

    상관 된 하위 쿼리로 인해 효율적이지는 않지만 그 작업을 수행 할 수 있습니다. 먼저 필요한 작업인지 확인하십시오.

    제안 3

    정보에 대한 열을 갖는 것이 더 좋을 것입니다. 그런 다음 SELECT b.*, ( SELECT count(*) from flight a where a.FlightCarrier = b.FlightCarrier and a.DestinationAirport = b.OriginAirport and a.ScheduledArrivalTimeUTC < b.ScheduledDepartureTimeUTC and a.ScheduledArrivalTimeUTC >= (b.ScheduledDepartureTimeUTC - (60 * 60 * 24)) and a.DelayedArrival = 1 ) FROM flight AS b; 를 저장하는 것처럼개별적으로 계산을 수행하십시오.  정보.

    b
    
    

    INSERT INTO flight ( ..., DelayedCarrierArrivals24H) SELECT ..., -- the values from your source ( SELECT ... ) AS DelayedCarrierArrivals24H;

관련 자료

  • 이전 innodb - MySQL의 테이블 스페이스, frm 및 ibd 파일 및 데이터베이스 페이지 간의 관계는 무엇입니까?
  • 다음 sql server - 존재하지 않는보기에서보기 만들기