2009-05-08 9 views
19

예제를 사용하여 설명하려고하는 일반적인 질문이 있습니다.MySQL/SQL : 업데이트 된 테이블 자체의 상관 하위 쿼리로 업데이트

아이디어는 각각의 단일 관련, 나는 몇 가지 항목을 가지고있다 "ID", "이름", "카테고리", "외모"와 "비"

내가 필드가있는 테이블을 말해봐 카테고리에 나타나고 여러 번 나타납니다. 비율 필드에는 카테고리의 총 출현 횟수 중 각 항목의 출현 비율이 포함되어야합니다.

  • 각 카테고리
    를 들어 이와 관련된 항목에 대한 모습의 총합을 찾을 : 의사 코드에서

    은 내가 필요한 것은 다음과 같은 것입니다. 예를 들어, 그것은 항목의 모습이

위의 범주에 대한 발견 합으로 나눈 값으로
이 난 이제 비율 값을 설정 각 항목에 대해 ( 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를 허용하지 않습니다, 나는이 달성의 다른 방법을 찾지 못했습니다 : 내가 어떻게해야 생각하는 것입니다.

    아이디어가 있으십니까? 이것은이 MSSQL에서 수행하는 방법이다

  • 답변

    45

    두 가지 답변 (어느 것도 완료되지 않았기 때문에 내 자신을 썼습니다)에 따라 결국 내가 한 일은

    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 
    

    매우 빠르게 작동합니다. 또한 상관 관계가있는 하위 쿼리를 사용하여 시도했지만 훨씬 느려졌으므로 (조밀도 순서) 조인을 고수하고 있습니다.

    +0

    대답을 답으로 표시하여이 질문을 답이없는 질문 목록에서 제거하십시오 :) –

    +1

    @Frans : 그렇게 할 수 있기까지 48 시간을 기다려야했습니다. 스택 오버플로 규칙입니다. –

    +0

    Nice. 전체 예제를 제공하는 데 시간을내어 주셔서 감사합니다! – Ben

    3

    , 나는 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 
    
    +0

    죄송합니다. MySQL에서는 작동하지 않습니다. 나는 그것이 mssql에서 작동한다고 확신하기 때문에 투표를하지 않겠다. –

    6

    를 사용하여 바로 업데이트 후 조인 Reference Manual – 13.2.11 UPDATE Syntax

    그래서 UPDATE의 표 내부에 표 2에 가입. ... set table1.foo = value 여기서 table2.bla = someothervalue

    이런 종류의 것들로 항상 매뉴얼을보십시오. MySql은 적절한 참조 설명서가 있으므로 올바른 구문을 얻기가 어렵지 않아야합니다.)

    +0

    고마워, 최대한 빨리 시도 할 것이다. 그리고 그런데 - RTFM을하고 질문을 게시하기 전에 의미가있는 모든 것을 시도했습니다. –

    +0

    감사합니다. 수동 입력으로 해결책을 찾았습니다.당신에게도 긍정적입니다 –