문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top