다음 쿼리가 작동하는 데 문제가 있습니다.
/*SET APPROPRIATE DATABASE CONTEXT*/
USE IDMAS_VESSELS;
/*BEGIN UPDATE SCRIPT*/
UPDATE INSPECTION i SET i.WALL_LOSS =
CASE WHEN i.STATUS IN('A','R')
THEN CASE WHEN i.INSPECTION_NO = (
SELECT INSPECTION_NO
FROM (SELECT * FROM INSPECTION) AS insp
/*CAN REFER TO TABLE IN UPDATE CLAUSE*/
WHERE EQUIPMENT_ID = i.EQUIPMENT_ID AND CML_ID = i.CML_ID
ORDER BY INSPECTION_DATE ASC, INSPECTION_NO
LIMIT 1
)
THEN i.NOMINAL_WALL_THICKNESS - i.MINIMUM_REMAINING_WALL_THICKNESS
ELSE (
SELECT MINIMUM_REMAINING_WALL_THICKNESS
FROM (
SELECT @rank:=@rank+1 AS DATE_POSITION, INSP.*
FROM (SELECT * FROM INSPECTION) AS insp
/*CODE FAILS AT THIS LINE*/
/*CAN NOT REFER TO TABLE IN UPDATE CLAUSE*/
WHERE insp.EQUIPMENT_ID = i.EQUIPMENT_ID AND insp.CML_ID = i.CML_ID
) as DATA_WITH_DATE_POSITIONS
WHERE DATE_POSITION = 1
) - i.MINIMUM_REMAINING_WALL_THICKNESS
END
ELSE NULL
END
WHERE i.EQUIPMENT_ID = '%';
실행하면 다음 오류가 발생합니다.
Error Code: 1054. Unknown column 'i.EQUIPMENT_ID' in 'where clause'
MySQL이 여러 하위 쿼리에 포함 된 경우 UPDATE 절의 테이블을 참조 할 수 없다는 결론을 내 렸습니다. 그러나 하나의 하위 쿼리에만 임베드 된 경우이를 참조 할 수 있습니다 (위 코드 내의 참고에서 식별 됨).
그래서 내 질문은 여러 하위 쿼리에 포함 될 때 UPDATE 절의 테이블을 어떻게 참조합니까?
귀하의 코드를 업데이트했습니다. 아래를 참조하십시오. 이제 의도 한대로 작동합니다. 업데이트 형식은 다음 링크를 기반으로합니다 ...
MySQL 오류 1093-FROM 절에서 업데이트 할 대상 테이블을 지정할 수 없습니다.
-- SET REQUIRED VARIABLE DEFAULTS
SET @prev_equip := null;
SET @prev_cml := null;
SET @prev_rwt := null;
SET @cnt := 1;
-- 1. WALL LOSS
UPDATE INSPECTION i
-- JOIN QUERIES TO MATCH INSPECTION RECORDS WITH ALL DATA TO BE MERGED/UPDATED TO INSPECTION TABLE
LEFT JOIN (
-- CREATE VIRTUAL INSPECTION TABLE WITH NEW RANKING AND PREVIOUS MIN RWT COLUMNS
SELECT IF(@prev_equip = ORDERED_DATA.EQUIPMENT_ID AND @prev_cml = ORDERED_DATA.CML_ID, @cnt := @cnt + 1, @cnt := 1) AS DATE_POSITION
, (@prev_rwt) AS PREVIOUS_MIN_RWT
, ORDERED_DATA.*
-- RE-EVALUATING VARIABLES BASED ON CURRENT ROW
, @prev_equip := ORDERED_DATA.EQUIPMENT_ID
, @prev_cml := ORDERED_DATA.CML_ID
, @prev_rwt := ORDERED_DATA.MINIMUM_REMAINING_WALL_THICKNESS
FROM (
-- ORDER DATA BY INSPECTION_DATE
SELECT EQUIPMENT_ID, CML_ID, INSPECTION_NO, MINIMUM_REMAINING_WALL_THICKNESS
FROM INSPECTION
ORDER BY EQUIPMENT_ID, CML_ID, INSPECTION_DATE ASC, INSPECTION_NO
) ORDERED_DATA
) R1 ON i.EQUIPMENT_ID = R1.EQUIPMENT_ID AND i.CML_ID = R1.CML_ID AND i.INSPECTION_NO = R1.INSPECTION_NO
SET i.WALL_LOSS =
CASE WHEN i.STATUS IN('A','R')
THEN CASE WHEN R1.DATE_POSITION = 1
THEN i.NOMINAL_WALL_THICKNESS - i.MINIMUM_REMAINING_WALL_THICKNESS
ELSE R1.PREVIOUS_MIN_RWT - i.MINIMUM_REMAINING_WALL_THICKNESS
END
ELSE NULL
END
WHERE i.EQUIPMENT_ID = '%';
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다