복붙노트

[SQL] MySQL은 / ​​SQL : 업데이트 된 테이블 자체에서 상관 하위 쿼리와 업데이트

SQL

MySQL은 / ​​SQL : 업데이트 된 테이블 자체에서 상관 하위 쿼리와 업데이트

내가 예를 사용하여 설명하려고 할 것이라는 일반적인 질문이 있습니다.

"ID", "이름", "카테고리", "외모"와 "비"나는 필드가있는 테이블을 말해봐

아이디어는 내가 여러 항목, 하나의 범주 및하세요 ""여러 번 관련된 각을 가지고있다. 비율 필드는 범주의 항목 모습의 총 개수 중 각 항목의 출연 비율을 포함해야한다.

의사 코드에서 내가 필요한 것은 다음과 같다 :

지금은 하나의 업데이트 쿼리와이를 달성하기 위해 노력하고있어,하지만 그것을 할 수없는 것. 내가 어떻게해야 생각하는 것입니다 :

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)

그러나 MySQL은 업데이트 열의 별명 T를 허용하지 않습니다, 나는이 달성의 다른 방법을 찾지 못했습니다.

어떤 아이디어?

해결법

  1. ==============================

    1.내가받은 두 답변 (나는 내 ​​자신을 썼다 그래서 어느 것도이 완료), 내가 결국 한 것이 아니라 다음입니다 다음 :

    내가받은 두 답변 (나는 내 ​​자신을 썼다 그래서 어느 것도이 완료), 내가 결국 한 것이 아니라 다음입니다 다음 :

    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 
    

    그것은 매우 빠르게 작동합니다. 내가 조인을 고수하고있어, 그래서 나는 또한 상관 서브 쿼리로 시도했지만 훨씬 느린 (수십 배)이었다.

  2. ==============================

    2.사용 UPDATE 직후에 조인 : 참조 설명서 - 13.2.11 UPDATE 구문

    사용 UPDATE 직후에 조인 : 참조 설명서 - 13.2.11 UPDATE 구문

    그래서 내부 UPDATE의 표는에 표 2에 가입 .... 세트 값 = table1.foo 여기서 table2.bla = someothervalue

    사물의 이러한 종류로, 항상 설명서를 보면. 그것이 올바른 신택스를 얻을 어려운 안되도록 MySQL은, 적절한 메뉴얼 갖는다)

  3. ==============================

    3.이것은이 MSSQL에서 수행하는 방법, 나는 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
    
  4. from https://stackoverflow.com/questions/839938/mysql-sql-update-with-correlated-subquery-from-the-updated-table-itself by cc-by-sa and MIT license