MySQL/SQL : 업데이트 된 테이블 자체의 상관 관계 서브 쿼리로 업데이트
-
22-07-2019 - |
문제
예제를 사용하여 설명하려고하는 일반적인 질문이 있습니다.
필드가있는 테이블이 있다고 가정 해
아이디어는 각각 단일 카테고리와 관련된 여러 항목이 있으며 여러 번 "나타납니다"라는 것입니다. 비율 필드에는 카테고리의 항목의 총 모양 수 중 각 항목의 모양의 백분율이 포함되어야합니다.
의사 코드에서 필요한 것은 다음과 같습니다.
각 카테고리에 대해
관련 항목에 대한 총 모양의 총합을 찾으십시오. 예를 들어 (예를 들어)select sum("appearances") from table group by category
)각 항목에 대해
비율 값을 항목의 외관을 위의 범주에 대해 찾은 합으로 나눈 값으로 설정합니다.
이제 단일 업데이트 쿼리로 이것을 달성하려고 노력하고 있지만 그렇게 할 수는 없습니다. 내가해야한다고 생각한 것은 다음과 같습니다.
update Table T
set T.ratio = T.appearances /
(
select sum(S.appearances)
from Table S
where S.id = T.id
)
그러나 MySQL은 업데이트 열에서 별칭 T를 수락하지 않으며이를 달성하는 다른 방법을 찾지 못했습니다.
어떤 아이디어?
해결책
내가받은 두 가지 답변을 따라 (그 중 어느 것도 완료되지 않았기 때문에 내 자신을 썼습니다), 결국 내가 한 일은 다음과 같습니다.
UPDATE Table AS target
INNER JOIN
(
select category, appearances_sum
from Table T inner join (
select category as cat, sum(appearances) as appearances_sum
from Table
group by cat
) as agg
where T.category = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum
매우 빨리 작동합니다. 나는 또한 상관 관계 서브 쿼리로 시도했지만 훨씬 느 렸습니다 (크기 순서). 그래서 나는 조인을 고수하고 있습니다.
다른 팁
업데이트 직후 조인 사용 :참조 설명서 - 13.2.11 업데이트 구문
따라서 Table1 Inner Join Table2 on .... set table1.foo = value where table2.bla = someothervalue
이런 종류의 것들로 항상 매뉴얼을 봅니다. MySQL은 적절한 참조 매뉴얼이 있으므로 올바른 구문을 얻는 것이 어렵지 않아야합니다.)
이것이 MSSQL에서 수행되는 방식입니다. MySQL은 동일하거나 유사하다고 생각합니다.
create table T (id int, ratio float, appearances int)
insert T values (1, null, 2)
insert T values (1, null, 3)
update T
set ratio = cast(appearances as float)/ agg.appearancesSum
from T join (
select id, sum(appearances) as appearancesSum
from T
group by id
) as agg on t.id = agg.id