2014-10-31 2 views
1

이 사이트를 샅샅이 조사하고 몇 가지 게시물을 찾았지만 그 청구서에 맞는 것은 없습니다.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. 

이 시점에서 나는 조금 붙어있어 누군가가 생명의 은인이되고 조언을 해주면 좋겠다고 생각하고 있었습니까?

+0

하위 쿼리'select .actual_value ... '의 결과를보십시오. 정말 하나 이상의 행을 반환합니까? 그럴 경우 수정하십시오. –

+0

안녕 마이크, 응답 주셔서 감사합니다. 결과가 두 개 이상 반환됩니다. 내 문제는 중복이 7000 개가 넘는 행에 발생했기 때문에 각 행을 개별적으로 수정할 수 없다는 것입니다. 2014-02-28의 prev_year_end에 대한 결과를 2014-08-21의 상단에 오버레이하여 2014-02-28의 prev_year_end가있는 모든 행을 궁극적으로 모두 제거 할 수 있도록 나머지는 모두 동일하므로 – PDrennan

+1

요점을 놓치지 마라. 여러 행을 반환하는 경우 dbms가 "actual_value"를 업데이트하는 데 사용해야합니까? 조인을 사용하거나 하위 쿼리의 WHERE 절 (아마도 company_no, site_no, sam_code 및 cost_code)에 더 많은 열을 포함시킵니다. –

답변

0

임시 테이블에 내부 조인을 수행하고 바꿀 행을 삭제하려고한다고 생각합니다. 임시 테이블에서 값을 다시 삽입하여 종료하십시오.

SELECT A.column1, A.column2, B.column3 as AcolumnName 
INTO #Temptbl 
FROM tbl A 
JOIN tbl B ON XXXX 

가입 조건에 XX를 대입하면 설명에 기반하여 가입하려는 항목에 대해 확신 할 수 없습니다. 관련 날짜가 있습니다. 그런 다음 다시 삽입하려는 셀에 삭제를 추가 한 다음 다시 삽입하십시오.

DELETE FROM tbl 
WHERE datecondition 

INSERT INTO tbl (SELECT * FROM #Temptbl) 

삭제가 걱정되면. 나는 1 단계 w/a * FROM #Temptbl을 선택하여 삭제하기 전에 결과를 확인합니다.

0

아마도이 구문은 읽을 수있는 가장 쉬운 구문입니다. 각 하위 쿼리는 단일 값을 반환합니다.

update dnl 
set actual_value = (select actual_value from dnl d where d.company_no = dnl.company_no and d.site_no = dnl.site_no and d.sam_code = dnl.sam_code and d.cost_code = dnl.cost_code and d.prev_year_end = '2014-02-28 00:00:00.000'), 
    actual_fcv = (select actual_fcv from dnl d where d.company_no = dnl.company_no and d.site_no = dnl.site_no and d.sam_code = dnl.sam_code and d.cost_code = dnl.cost_code and d.prev_year_end = '2014-02-28 00:00:00.000'), 
    actual_fav = (select actual_fav from dnl d where d.company_no = dnl.company_no and d.site_no = dnl.site_no and d.sam_code = dnl.sam_code and d.cost_code = dnl.cost_code and d.prev_year_end = '2014-02-28 00:00:00.000'), 
    actual_fcq = (select actual_fcq from dnl d where d.company_no = dnl.company_no and d.site_no = dnl.site_no and d.sam_code = dnl.sam_code and d.cost_code = dnl.cost_code and d.prev_year_end = '2014-02-28 00:00:00.000'), 
    actual_faq = (select actual_faq from dnl d where d.company_no = dnl.company_no and d.site_no = dnl.site_no and d.sam_code = dnl.sam_code and d.cost_code = dnl.cost_code and d.prev_year_end = '2014-02-28 00:00:00.000') 
where prev_year_end = '2014-08-31 00:00:00.000'; 


당신이 TABLE과 INSERT 문을 CREATE 포함하면 더 많은 응답을 얻을 것이다.

create table dnl (
    company_no char(2), 
    site_no integer, 
    sam_code integer, 
    cost_code varchar(5), 
    prev_year_end timestamp, 
    period_end_date timestamp, 
    prev_period_end timestamp, 
    ledger_type_cnp char(3), 
    actual_value float, 
    actual_fcv float, 
    actual_fav float, 
    actual_fcq float, 
    actual_faq float 
); 

insert into dnl values 
('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); 
관련 문제