تحديث حقل بناء على المجموع الفرعي من جدول آخر
-
22-07-2019 - |
سؤال
أنا باستخدام أوراكل(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