একটি এসকিউএল আপডেট ক্যোয়ারীতে সমষ্টিগত ফাংশন?


98

আমি অন্য টেবিলের মানগুলির সমষ্টিতে এক টেবিলের মান সেট করার চেষ্টা করছি। এই লাইন বরাবর কিছু:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3

অবশ্যই, যেমন এটি দাঁড়িয়েছে, এটি কাজ SETকরে না - সমর্থন করে না SUMএবং এটি সমর্থন করে না GROUP BY

আমার এটি জানা উচিত, তবে আমার মন শূন্য আঁকছে। আমি কি ভুল করছি?


দুর্দান্ত প্রশ্ন ... আমি আশা করি আমি একাধিকবার উত্সাহ দিতে পারতাম।
জো

উত্তর:


150
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
   from table2
  group by field3) as t2
on t2.field3 = t1.field3  

41
আমি তিনটি প্রশ্নের পাশাপাশি পাশাপাশি রেখেছিলাম এবং একটি কার্যকর করার পরিকল্পনা চালিয়েছি। এই উত্তরের 5% খরচ হয়েছিল।
মার্গারেট

মার্জিত, কার্যকর করা সহজ ... আপনি সারা দিন কোথায় ছিলেন ??? আমি এখন এক ঘণ্টারও বেশি সময় ধরে এটির উপরে মাথা
বেঁধে দিচ্ছি

4
গুরুত্বপূর্ণ: আপনি যে ক্ষেত্রগুলির দ্বারা গোষ্ঠী করছেন সেগুলির কোনওটি শোধনযোগ্য হতে পারে না দেখুন (যেমন উপরে ক্ষেত্র 3)। আপনি (এই জন্য অ্যাকাউন্টে 'সম্প্রদায়ে যোগ' সংশোধন করার প্রয়োজন চাই অথবা আপনার অঙ্কের বেঠিক হতে হবে stackoverflow.com/a/14366034/16940 )
Simon_Weaver

10

ব্যবহার:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)

14
আমি তিনটি প্রশ্নের পাশাপাশি পাশাপাশি রেখেছিলাম এবং একটি কার্যকর করার পরিকল্পনা চালিয়েছি। এই উত্তরের ব্যয় ছিল 44%।
মার্গারেট

এটি আমার পক্ষে কার্যকর হয়নি, কারণ t2.filed3 একই নাম ছিল টেবিল 1.ফিল্ড 2, সুতরাং পর্দার পিছনে সম্পাদিত যোগদানটি সঠিকভাবে কাজ করে নি। (আমি ধরে নিই যে পর্দার আড়ালে একটি যোগদান রয়েছে)
জো

5

অথবা আপনি জেব্রুকস এবং ওএমজি পনিগুলির উত্তরগুলির মিশ্রণটি ব্যবহার করতে পারেন :

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1

16
আমি তিনটি প্রশ্নের পাশাপাশি পাশাপাশি রেখেছিলাম এবং একটি কার্যকর করার পরিকল্পনা চালিয়েছি। এই উত্তরের 51% দাম ছিল।
মার্গারেট

জি জনাব আমি দেকছি! এবং প্রতিক্রিয়ার জন্য ধন্যবাদ। আমি এটিকে আমার টুলবক্সে যুক্ত করব। :-)
পাওলো সান্টোস

এটি হ'ল কারণ আপনি এমন একটি সাবস্ক্রিরি ব্যবহার করছেন যা অবশ্যই অপটিমাইজারের সাথে, প্রতিটি সারিতে বৈধ যে এসইউএম () সরিয়ে ফেলতে হবে
ক্লিফটন_এইচ

4

ক্রস প্রয়োগের জন্য একটি ভাল পরিস্থিতি

UPDATE t1
   SET t1.field1 = t2.field2Sum
  FROM table1 t1
 CROSS APPLY (SELECT SUM(field2) as field2Sum
                FROM table2 t2
               WHERE t2.field3 = t1.field3) AS t2

3

আমি জানি প্রশ্নটি এসকিউএল সার্ভারকে ট্যাগ করা হয়েছে তবে আপনি পোস্টগ্র্রেএসকিউএল ব্যবহার করছেন যদি যোগ দিয়ে আপডেটের সাথে সাবধান হন । @ জব্রুকস উত্তরটি কাজ করবে না:

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3  

আপনাকে এটির সাথে মানিয়ে নিতে হবে:

UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  

পোস্টগ্র্রেএসকিউএলকে স্ব-যোগদান হিসাবে from_listকেন FROMবিবেচনা করা হয় তা পেতে ডকের প্যারামিটারটি দেখুন : https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

আপনি নীচের মত সিটিইও ব্যবহার করতে পারেন।

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.