2012-10-29 5 views
0

나는 MySQL에서 직접 잘 작동하는 SQL 쿼리를 가지고 있지만 DBIx :: Class를 통해 사용하도록 변환하려고 애 쓰고있다. 여기서 쿼리를 단순화했다.DBIx :: Class 다른 테이블에서 하나의 테이블 업데이트

UPDATE table1, table2 
    SET table1.field1 = SOMEFUNC(table1.field4/table2.field2) 
    WHERE table1.id = table2.id 
     AND table1.field3 = table2.field3 
     AND table2.field2 IS NOT NULL 
     AND table2.field2 > 0; 

의견이 있으십니까?

+0

다른 방법으로 구현해야하므로 (즉, resultset-> search를 수행 한 다음 각 행을 개별적으로 업데이트해야 함) 원본 코드가 더 이상 필요하지 않지만 체인을 통해 결합 검색을 구현하려고했습니다 업데이트로 보내지 만, MySQL은 where 절에서 필드를 업데이트하려고하고 있다고 불평합니다. –

답변

0

* _related 메소드 사용은 어떻게됩니까?

+0

솔루션을 더 명확하게 설명하거나 코드를 추가 할 수 있습니까? – IvanH

1

비슷한 경우 나는 보통 관련 테이블에서 검색을 수행합니다. 귀하의 경우 두 결과 소스 : 표 1표 2이 있습니다. table1은 테이블 테이블 2 (대부분 가능)과 관계가 있습니다. 이름은 2 테이블 2입니다. 이제이 관계를 사용하여 표 2에서 검색을 수행하십시오 표 2.

my $resultset = $schema->resultset('table1')->search_rs(
    { 
     me.field3 => table2.field3, 
     table2.field2 => {'!=', '' }, 
     table2.field2 > 0 
    }, 
    { 
     'join' => 'table2', 
     'select' => ['me.field1', 'me.field4', 'table2.field2', 'me.field4'/'table2.field2' ], 
     'as' => ['field1','field4', 'field2', 'division_result'] 
    } 
); 

while (my $this_res_row = $resultset->next) { 
    ## Presuming somefunc is a perl subroutine 
    $this_res_row->update({ field1 => somefunc($this_res_row->get_column('division_result')) }); 
} 

은 어쩌면, 나는 당신이 하나의 dbic 갱신() 문에서 원하는 작업을 수행 할 수 없습니다 생각 당신이 올 한 솔루션입니다. 불행히도 각 update() 문은 데이터베이스에 별도로 기록됩니다.

는 그런데, 나는 당신이 이미 ID 필드를 통해 수행해야, FIELD3를 통해 같은 테이블에 두 번째 조합을 따 좋은 아이디어라고 생각하지 않습니다. 왜 다른 걸 필요로하니?

그리고 나는 데이터베이스 트리거를 사용하여 코드를 구현하는 것이 더 좋은 아이디어라고 생각합니다.

코드를 테스트하지 않았으므로 약간의 실수가있을 수 있지만 원하는 것을 얻는 방법에 대한 아이디어는 파악해야합니다.

관련 문제