ओरेकल में, मैं सूची में चयन के आधार पर अंतिम घटना के लिए एक टेबल पर एक अद्यतन करना चाहता हूं, जैसे कुछ:

UPDATE table t1
set t1.fieldA = 0
where t1.id in ( 
   select t2.id, max(t2.TIMESTAMP) 
   from table t2 
   where t2.id in (1111,2222,33333) 
   group by t2.id
   );

यह क्वेरी काम नहीं करती है, मुझे "बहुत अधिक मान" त्रुटि मिली है। कोई विचार? धन्यवाद

1
Braninoca 28 जुलाई 2017, 07:57

2 जवाब

सबसे बढ़िया उत्तर

मेरा मानना ​​​​है कि ऑरैकल कई कॉलम का समर्थन करता है, ताकि आप कोशिश कर सकें:

UPDATE table t1 
set t1.fieldA = 0 
where 
  (t1.id,t1.timestamp) in ( select t2.id, max(t2.TIMESTAMP) from table t2 where t2.id in (1111,2222,33333) group by t2.id );

अनिवार्य रूप से यदि आप IN के दाईं ओर एक उपश्रेणी प्रदान कर रहे हैं जिसका परिणाम दो स्तंभों के साथ सेट है, तो आपको IN के बाईं ओर कोष्ठक में दोनों स्तंभों के नाम प्रदान करने होंगे

संयोग से, मुझे अधिकतम मूल्य के आधार पर अपडेट करना कभी पसंद नहीं आया यदि आवश्यकता यह है कि केवल एक पंक्ति को अपडेट किया जाए, क्योंकि समान अधिकतम मान वाली दो पंक्तियों को अपडेट किया जाएगा। इस प्रकार की क्वेरी बेहतर है:

Update table
Set fieldA=0
Where rowid in(
  select rowid from (
    select rowid, row_number() over(partition by id order by timestamp desc
  ) as rown from table
) where rown=1)

यदि, हालांकि, टेबल पर आपकी प्राथमिक कुंजी में कंपाउंड के हिस्से के रूप में टाइम स्टैंप शामिल है, तो यहां एक ही आईडी/टाइमस्टैम्प के साथ दो पंक्तियां होने की कोई चिंता नहीं है .. यह शायद ही कभी मामला है!

-1
Caius Jard 28 जुलाई 2017, 17:51

आपके उप-चयन में 2 (बहुत अधिक) फ़ील्ड हैं, इसलिए इसकी तुलना आईडी से नहीं की जा सकती। टाइमस्टैम्प की तुलना अधिकतम टाइमस्टैम्प से करें।

UPDATE table t1 set t1.fieldA = 0 
where t1.TIMESTAMP = (select max(t2.TIMESTAMP) from table t2 where t2.id = t1.id  )
and id in  (1111,2222,33333)
0
Turo 28 जुलाई 2017, 08:30