programing

동일한 테이블의 다른 여러 행과 관련된 테이블 업데이트 시도

css3 2023. 9. 27. 18:03

동일한 테이블의 다른 여러 행과 관련된 테이블 업데이트 시도

일반적인 왼쪽 열과 오른쪽 열(trLeft 및 trRight)을 가진 중첩 집합을 사용하여 트리를 나타내는 표가 있습니다.최적화를 위해 트리에 행의 레벨도 포함합니다. 이는 트리 ROOT까지의 부모 수입니다.

중첩 집합에서 행 A의 부모는 모두 다른 행 B입니다.B.trLeft < A.trLeft AND B.trRight > A.trRight.

따라서 해당 행을 세면 레벨이 반환되고 모든 행을 올바른 레벨로 업데이트하기 위해 시작에 대해 다음과 같은 업데이트 쿼리가 나타납니다.

UPDATE Groups AS g1 SET g1.trLevel = ( 
    SELECT COUNT(*) FROM Groups AS g2 WHERE g2.trLeft < g1.trLeft AND g2.trRight > g1.trRight ) ;

그러나 이로 인해 오류 1093 "FROM 절에서 업데이트할 대상 테이블 'g1'을 지정할 수 없습니다.

이것을 피할 방법이 있습니까?

카운트를 선택에 끼워 넣어야 합니다.이것이 효과가 있을 것으로 생각합니다.

EDITED: Updated query

UPDATE Groups SET trLevel = (
    SELECT * FROM 
    (
        SELECT COUNT(*) FROM Groups g2 inner join Groups g1 on g2.unique_id = g1.unique_id WHERE g2.trLeft < g1.trLeft AND g2.trRight > g1.trRight 
    ) AS my_count
) ;

AS my_count는 MySQL에 이 쿼리로부터 tmp 테이블을 생성하도록 지시하기 때문에 중요합니다.그런 다음 my_count tmp 테이블이 UPDATE 문의 소스로 사용됩니다.

다음과 같이 파생된 테이블을 하위 쿼리 안에 둥지를 틀게 하는 것이 어리석은 해결 방법은 다음과 같습니다.

UPDATE Groups AS g1 
SET g1.trLevel = (
  SELECT COUNT(*) 
  FROM ( 
    SELECT *
    FROM Groups AS g2 
  ) AS temp
  WHERE 
    temp.trLeft < g1.trLeft 
    AND temp.trRight > g1.trRight 
);

먼저 테이블을 이렇게 만들어서 테스트를 해봤습니다.

CREATE TABLE Groups (trLeft int, trRight int, trLevel int);

INSERT INTO Groups (trLeft, trRight) VALUES (1, 4), (5, 6), (2, 3);

그리고 그것은 동작한다.

언급URL : https://stackoverflow.com/questions/25062195/trying-to-update-a-table-related-to-multiple-other-rows-in-the-same-table