سؤال

أنا باستخدام أوراكل(10).

لقد حصلت على اثنين من الجداول على النحو التالي:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 متصل العديد من واحدة إلى جدول1 متصلا عبر معرف.

ما احتاج اليه هو تحديث-ing جدول1.موعد مع:آخر (أقرب) من تاريخ Table2 حيث جدول1.المبلغ - مبلغ(Table2.AMOUNT1) <= 0, عند قراءة الجدول 2 إلى الوراء قبل Table2.حقل التاريخ.

هناك طريقة بسيطة للقيام بذلك ؟

شكرا مقدما!

تحديث: كما أرى من إجاباتك كان misspecified السؤال قليلا.حتى هنا يذهب مفصل على سبيل المثال:

جدول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 كمثال يعني و تسمية الأعمدة تاريخ THEDATE منذ تاريخ كلمة محجوزة في أوراكل:

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