প্রশ্নটি পুরানো তবে আমি অনুভব করেছি যে সেরা উত্তরটি এখনও দেওয়া হয়নি।
কলামের নাম উল্লেখ না করে একটি UPDATE
বাক্য গঠন আছে ... ?
ডায়নামিক এসকিউএল সহ সাধারণ সমাধান
( id
উদাহরণস্বরূপ) যোগদানের জন্য কিছু অনন্য কলাম (গুলি) ব্যতীত আপনার কোনও কলামের নাম জানতে হবে না । আমি ভাবতে পারি যে কোনও সম্ভাব্য কোণার ক্ষেত্রে নির্ভরযোগ্যভাবে কাজ করে।
এটি পোস্টগ্রাইএসকিউএল-এর জন্য নির্দিষ্ট। আমি গতিশীল উপর ভিত্তি করে কোড বিল্ডিং করছি information_schema বিশেষ টেবিলে, information_schema.columns
যা এসকিউএল মান এবং সবচেয়ে প্রধান RDBMS (ওরাকল ব্যতীত) সংজ্ঞায়িত করা হয় এটা আছে। তবে ডায়ামিক এসকিউএল সম্পাদনকারী পিএল / পিজিএসকিউএল কোড DO
সহ একটি বিবৃতি সম্পূর্ণ অ-মানক পোস্টগ্রিসএসকিউএল সিনট্যাক্স।
DO
$do$
BEGIN
EXECUTE (
SELECT
'UPDATE b
SET (' || string_agg( quote_ident(column_name), ',') || ')
= (' || string_agg('a.' || quote_ident(column_name), ',') || ')
FROM a
WHERE b.id = 123
AND a.id = b.id'
FROM information_schema.columns
WHERE table_name = 'a' -- table name, case sensitive
AND table_schema = 'public' -- schema name, case sensitive
AND column_name <> 'id' -- all columns except id
);
END
$do$;
একটি ম্যাচিং কলাম ধরে নেওয়া যাক b
জন্য যে কলাম a
, কিন্তু না অন্য উপায় বৃত্তাকার। b
অতিরিক্ত কলাম থাকতে পারে।
WHERE b.id = 123
selectedচ্ছিক, একটি নির্বাচিত সারি আপডেট করতে।
এসকিউএল ফিডল।
আরও ব্যাখ্যা সহ সম্পর্কিত উত্তর:
প্লেইন এসকিউএল সহ আংশিক সমাধান
ভাগ করা কলামগুলির তালিকা সহ
উভয় সারণী ভাগ করে নেওয়া কলামের নামের তালিকাটি এখনও আপনার জানতে হবে। একাধিক কলামগুলি আপডেট করার জন্য একটি সিনট্যাক্স শর্টকাট সহ - অন্যান্য উত্তর যে কোনও ক্ষেত্রে এখন পর্যন্ত প্রস্তাবিতের চেয়ে কম।
UPDATE b
SET ( column1, column2, column3)
= (a.column1, a.column2, a.column3)
FROM a
WHERE b.id = 123 -- optional, to update only selected row
AND a.id = b.id;
এসকিউএল ফিডল।
এই সিনট্যাক্সটি প্রশ্ন জিজ্ঞাসার অনেক আগে 2006 সালে পোস্টগ্রিস 8.2 এর সাথে প্রবর্তিত হয়েছিল। ম্যানুয়ালটিতে বিশদ।
সম্পর্কিত:
কলামের তালিকা সহ B
যদি সমস্ত কলামগুলি A
সংজ্ঞায়িত করা হয় NOT NULL
(তবে প্রয়োজনীয় নয় B
),
এবং আপনি কলামের নামগুলি জানেনB
(তবে প্রয়োজনীয়ভাবে নয় A
)।
UPDATE b
SET (column1, column2, column3, column4)
= (COALESCE(ab.column1, b.column1)
, COALESCE(ab.column2, b.column2)
, COALESCE(ab.column3, b.column3)
, COALESCE(ab.column4, b.column4)
)
FROM (
SELECT *
FROM a
NATURAL LEFT JOIN b -- append missing columns
WHERE b.id IS NULL -- only if anything actually changes
AND a.id = 123 -- optional, to update only selected row
) ab
WHERE b.id = ab.id;
NATURAL LEFT JOIN
থেকে একটি সারিতে যোগদান করে b
যেখানে একই নামের সব কলাম একই মান ধরে রাখুন। আমাদের এক্ষেত্রে আপডেটের দরকার নেই (কোনও পরিবর্তন হয় না) এবং প্রক্রিয়া শুরুর দিকে ( WHERE b.id IS NULL
)) সারিগুলি সরাতে পারি ।
আমাদের এখনও একটি মিলের সারিটি খুঁজে পাওয়া দরকার, সুতরাং b.id = ab.id
বাহ্যিক ক্যোয়ারিতে।
ডিবি <> ফ্রিডল এখানে
পুরাতন স্ক্যালফিল্ড।
এটি ক্লজ বাদেFROM
স্ট্যান্ডার্ড এসকিউএল ।
কোন কলামটি প্রকৃতপক্ষে উপস্থিত A
তা বিবেচনা করেই কার্যকর হয় , তবে কোয়েরিটি প্রকৃত NULL মান এবং অনুপস্থিত কলামগুলির মধ্যে পার্থক্য করতে পারে না A
, সুতরাং সমস্ত কলাম A
সংজ্ঞায়িত করা হলে এটি কেবল নির্ভরযোগ্য NOT NULL
।
উভয় সারণী সম্পর্কে আপনি কী জানেন তার উপর নির্ভর করে একাধিক সম্ভাব্য প্রকরণ রয়েছে ।