다른 테이블의 하위 운동을 기반으로 필드를 업데이트하십시오
-
22-07-2019 - |
문제
Oracle (10)을 사용하고 있습니다.
다음과 같이 두 개의 테이블이 있습니다.
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
표 2는 많은 사람들이 ID를 통해 연결된 하나에 연결됩니다.
내가 필요로하는 것은 update -ing table1.date with : with : table1.amount -sum (table2.amount1) <= 0, table2.date 필드에 의해 표 2를 읽을 때.
간단한 방법이 있습니까?
미리 감사드립니다!
업데이트: 내가 당신의 대답에서 볼 수 있듯이 나는 그 질문을 약간 잘못 지정했습니다. 그래서 여기에 자세한 예가 있습니다.
표 1은 다음과 같습니다.
ID: 1 AMOUNT:100 DATE:NULL
table2는 (ID : 1 용 ID는 여기에 나열되지 않음) : :
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
그래서이 경우에 필요합니다 20080111
표 1의 날짜는 50+30+25 => 100입니다.
해결책
수정 된 질문에 따라 분석 기능을 사용하는 경우입니다.
예제에서 알 수 있듯이 <= 100이 아닌> = 100을 의미한다고 가정하고, 날짜 이후로 열을 이름 바꾸는 날짜는 Oracle에서 예약 된 단어입니다.
update table1 set thedate=
( select max(thedate) from
( select id, thedate,
sum(amount1) over (partition by id order by thedate desc) cumsum
from table2
) v
where v.cumsum >= 100
and v.id = table1.id
)
100이 표 1의 현재 값을 의미하는 경우 해당 라인을 다음으로 변경합니다.
where v.cumsum >= table1.amount
다른 팁
우선 - 데이터베이스 레이아웃이 심하게 잘못 느껴지지만 변경하고 싶지 않습니다. Table1
아마도 견해 일 것입니다 Table2
적절한 정규화의 인상을주지 않습니다. 같은 것 (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
나에게 훨씬 더 의미가있을 것입니다.
그러나 문제를 해결하기 위해 (이것은 t-sql입니다.UPDATE FROM
"구문이지만 오라클은 그것을 알고 있다고 생각합니다) :
UPDATE
Table1
SET
Date = Table2Aggregate.MinDate
FROM
Table1
INNER JOIN (
SELECT Id, SUM(Amount1) SumAmount1, MIN(Date) MinDate
FROM Table2
GROUP BY Id
) AS Table2Aggregate ON Table1.Id = Table2Aggregate.ID
WHERE
Table1.Amount - Table2Aggregate.SumAmount1 <= 0