동일한 테이블의 다른 여러 행과 관련된 테이블 업데이트 시도
일반적인 왼쪽 열과 오른쪽 열(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
'programing' 카테고리의 다른 글
시스템 부팅 시 도커 컨테이너가 자동으로 시작되도록 하려면 어떻게 해야 합니까? (0) | 2023.09.27 |
---|---|
고투 사용을 피하고 중첩 루프를 효율적으로 끊는 방법 (0) | 2023.09.27 |
Excel 매크로를 호출하고 매크로가 완료될 때까지 기다리는 VBA Outlook (0) | 2023.09.27 |
Cannot find name 'console'. What could be the reason for this? (0) | 2023.09.27 |
What APIs are used to draw over other apps (like Facebook's Chat Heads)? (0) | 2023.09.27 |