이 사이트를 샅샅이 조사하고 몇 가지 게시물을 찾았지만 그 청구서에 맞는 것은 없습니다.SQL이 동일한 테이블에 여러 값을 가진 여러 행을 업데이트합니다.
company_no site_no sam_code cost_code prev_year_end period_end_date prev_period_end ledger_type_cnp actual_value actual_fcv actual_fav actual_fcq actual_faq
G1 51 6 0 2014-02-28 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM 791.94 791.94 NULL 0 NULL
G1 51 6 0 2014-08-31 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM 791.94 791.94 NULL 0 NULL
G1 51 6 GIE 2014-02-28 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM -832.14 -832.14 0 0 0
G1 51 6 GIE 2014-08-31 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM -791.94 -791.94 0 0 0
G1 51 7 0 2014-02-28 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM -1157.32 -1157.32 NULL 0 NULL
G1 51 7 0 2014-08-31 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM -1157.32 -1157.32 NULL 0 NULL
G1 51 7 L01 2014-02-28 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM 1157.32 1157.32 NULL 3570 NULL
G1 51 7 L01 2014-08-31 00:00:00.00 2015-02-28 00:00:00.00 2015-01-31 00:00:00.00 NOM 1157.32 1157.32 NULL 3570 NULL
위의 표에 대한 사과, 나는 이미지를 첨부하려고했지만 평판 포인트가 없었습니다.
제 문제는 테이블 dnl에 복제본이 있다는 것입니다. 행은 prev_year_end 및 actual_ * 열을 제외하고 동일합니다. 내가 원하는 것은 우선 prev_year_end '2014-02-28 00 : 00 : 00.000에 대한 actual_ * 값과 일치하도록'2014-08-31 00 : 00 : 00.000 '에 대한 모든 prev_year_end actual_ * 값을 설정하는 것입니다.
update dnl
set actual_value =
(select actual_value
from dnl where (period_end_date <= '2015-02-28 00:00:00.000'
and period_end_date >= '2014-09-30 00:00:00.000')
and prev_year_end = '2014-02-28 00:00:00.000'
and company_no = 'G1')
where
(period_end_date <= '2015-02-28 00:00:00.000'
and period_end_date >= '2014-09-30 00:00:00.000')
and prev_year_end = '2014-08-31 00:00:00.000'
and company_no = 'G1'
와 가진 : 내가 가진 업데이트 해봤 지금까지
(나는 만든 감각을 희망)
update a
set a.actual_value =
(select b.actual_value
from dnl b where (b.period_end_date <= '2015-02-28 00:00:00.000'
and b.period_end_date >= '2014-09-30 00:00:00.000')
and b.prev_year_end = '2014-02-28 00:00:00.000'
and b.company_no = 'G1')
FROM dnl a
INNER JOIN dnl b
ON a.period_end_date = b.period_end_date
where
(a.period_end_date <= '2015-02-28 00:00:00.000'
and a.period_end_date >= '2014-09-30 00:00:00.000')
and a.prev_year_end = '2014-08-31 00:00:00.000'
and a.company_no = 'G1'
을하지만 각각의 메시지와 함께 실패 :
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
이 시점에서 나는 조금 붙어있어 누군가가 생명의 은인이되고 조언을 해주면 좋겠다고 생각하고 있었습니까?
하위 쿼리'select .actual_value ... '의 결과를보십시오. 정말 하나 이상의 행을 반환합니까? 그럴 경우 수정하십시오. –
안녕 마이크, 응답 주셔서 감사합니다. 결과가 두 개 이상 반환됩니다. 내 문제는 중복이 7000 개가 넘는 행에 발생했기 때문에 각 행을 개별적으로 수정할 수 없다는 것입니다. 2014-02-28의 prev_year_end에 대한 결과를 2014-08-21의 상단에 오버레이하여 2014-02-28의 prev_year_end가있는 모든 행을 궁극적으로 모두 제거 할 수 있도록 나머지는 모두 동일하므로 – PDrennan
요점을 놓치지 마라. 여러 행을 반환하는 경우 dbms가 "actual_value"를 업데이트하는 데 사용해야합니까? 조인을 사용하거나 하위 쿼리의 WHERE 절 (아마도 company_no, site_no, sam_code 및 cost_code)에 더 많은 열을 포함시킵니다. –