এসকিউএল সার্ভারে যোগদান করে একটি টেবিল আপডেট করবেন?


834

আমি অন্য টেবিলের সাথে যুক্ত হতে একটি টেবিলের একটি কলাম আপডেট করতে চাই যেমন:

UPDATE table1 a 
INNER JOIN table2 b ON a.commonfield = b.[common field] 
SET a.CalculatedColumn= b.[Calculated Column]
WHERE 
    b.[common field]= a.commonfield
AND a.BatchNO = '110'

তবে এটি অভিযোগ করছে:

এমএসজি 170, স্তর 15, রাজ্য 1, লাইন 2
লাইন 2: 'এ' এর নিকটে ভুল সিনট্যাক্স।

এখানে কি ভুল?

উত্তর:


1596

আপনার কাছে এসকিউএল সার্ভারের স্বত্বগত UPDATE FROMসিনট্যাক্সটি নিচে নেই। আপনার কেন যোগ দিতে হবে CommonFieldএবং পরে এটিতে ফিল্টার করার দরকারও নিশ্চিত হন না। এটা চেষ্টা কর:

UPDATE t1
  SET t1.CalculatedColumn = t2.[Calculated Column]
  FROM dbo.Table1 AS t1
  INNER JOIN dbo.Table2 AS t2
  ON t1.CommonField = t2.[Common Field]
  WHERE t1.BatchNo = '110';

যদি আপনি সত্যিই নির্বোধ কিছু করছেন - যেমন একটি কলামের মানকে অন্য কলামের সমষ্টিতে নিয়মিত সেট করার চেষ্টা করা (যা অপ্রয়োজনীয় ডেটা সংরক্ষণের নীতি লঙ্ঘন করে) আপনি একটি সিটিই ব্যবহার করতে পারেন (সাধারণ সারণী প্রকাশ) - এখানে দেখুন এবং এখানে আরো বিস্তারিত জানার জন্য:

;WITH t2 AS
(
  SELECT [key], CalculatedColumn = SUM(some_column)
    FROM dbo.table2
    GROUP BY [key]
)
UPDATE t1
  SET t1.CalculatedColumn = t2.CalculatedColumn
  FROM dbo.table1 AS t1
  INNER JOIN t2
  ON t1.[key] = t2.[key];

এটি সত্যিই নির্বোধ হওয়ার কারণটি হ'ল যে কোনও table2পরিবর্তনতে প্রতি সারিতে একবারে এই পুরো আপডেটটি আপনাকে আবার চালাতে হবে । এ SUMএমন একটি জিনিস যা আপনি সর্বদা রানটাইমের সময় গণনা করতে পারেন এবং এটি করার ক্ষেত্রে কখনই ফলাফলটি বাসি worry


3
যখন আমি এটি চেষ্টা করি, এটি পছন্দ করে না UPDATE table1 a SET a.[field] = b.[field] - একটি উপনাম অপসারণ কাজ করে, তাইUPDATE table1 a SET [field] = b.[field]
বাল্ডমোশার

@ বাল্ডমোশার আমি বাজি দিয়েছি যে এখানে আরও একটি সমস্যা আছে, আপনি কি এসকিউএল ফিডেলে কোনও প্রতিবেদন পোস্ট করতে পারেন?
অ্যারন বার্ট্র্যান্ড

1
মাইএসকিউএলে আমার পক্ষে কাজ করেনি। আমি নিম্নলিখিত (যা আরো ইন্দ্রিয় তোলে) ব্যবহার করতে ছিল: UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
জর্জ

15
@ জর্জিরাপেল অবশ্যই, সম্ভবত অন্য অনেক প্ল্যাটফর্মে কাজ করবে না। প্রশ্ন এসকিউএল সার্ভার সম্পর্কে।
অ্যারন বারট্রান্ড

ধরা যাক, টি 1 থেকে একাধিক রেকর্ডগুলি একই রেকর্ডটি টি 2 থেকে রেফারেন্স করেছে তাই একই টি 2 রেকর্ডের যোগদানের ফলাফল একাধিক সারিতে ফিরে এসেছে। আপনার প্রথম উদাহরণে, আপনি যদি পরিবর্তে টি 2 আপডেট করেন তবে এটি রেকর্ডটি একাধিকবার বা মাত্র একবার আপডেট করবে?
xr280xr

46

এটির মতো চেষ্টা করুন:

begin tran
    UPDATE a 
    SET a.CalculatedColumn= b.[Calculated Column]
    FROM table1 a INNER JOIN table2 b ON a.commonfield = b.[common field] 
    WHERE a.BatchNO = '110'
commit tran

29

হারুনের উপরের উত্তর সঠিক:

UPDATE a
  SET a.CalculatedColumn = b.[Calculated Column]
  FROM Table1 AS a
  INNER JOIN Table2 AS b
  ON a.CommonField = b.[Common Field]
  WHERE a.BatchNo = '110';

এসকিউএল সার্ভারে যখন এই টেবিলটি আপডেট করার সময় আমরা কোনও টেবিলের ওরফে ব্যবহার করার চেষ্টা করি তখন এই সমস্যাটি কেন ঘটে তা কেবল যুক্ত করতে চাই, নীচে উল্লিখিত বাক্য গঠন সর্বদা ত্রুটি দেয়:

update tableName t 
set t.name = 'books new' 
where t.id = 1

আপনি যদি কোনও একক টেবিল আপডেট করছেন বা যোগদান ব্যবহার করার সময় আপডেট করছেন তবে কেস কোনও হতে পারে।

যদিও উপরের ক্যোয়ারী পিএল / এসকিউএল তে কাজ করবে তবে এসকিউএল সার্ভারে নয়।

এসকিউএল সার্ভারে সারণী ওরফে ব্যবহার করার সময় কোনও টেবিল আপডেট করার সঠিক উপায় হ'ল:

update t 
set t.name = 'books new' 
from tableName t 
where t.id = 1

আশা করি এখানে ত্রুটি কেন এসেছে তা প্রত্যেককে সহায়তা করবে।


সুন্দর ধন্যবাদ আপনাকে. আপনার উত্তর এই প্রশ্নের সঠিক উত্তর।
ওলা Ström

4
MERGE table1 T
   USING table2 S
      ON T.CommonField = S."Common Field"
         AND T.BatchNo = '110'
WHEN MATCHED THEN
   UPDATE
      SET CalculatedColumn = S."Calculated Column";

3

এসকিউএল সার্ভার ২০১২ এর মতো মনে হচ্ছে টেরাদাতার পুরানো আপডেট সিনট্যাক্সটিও পরিচালনা করতে পারে:

UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a, table2 b 
WHERE 
    b.[common field]= a.commonfield
AND a.BatchNO = '110'

যদি আমি সঠিকভাবে মনে রাখি, আমি অনুরূপ ক্যোয়ারির চেষ্টা করার সময় ২০০৮আর 2 ত্রুটি দিচ্ছিল।



2

আপডেটের আগে পরীক্ষার হিসাবে আমি যে সারিগুলি আপডেট করতে চাই সেগুলি পেতে আমি একটি আপডেটকে একটি নির্বাচনে রূপান্তরিত করা দরকারী বলে মনে করি। আমি যদি সঠিক পাতাগুলি পছন্দ করতে পারি তবে আমি আপডেট করতে চাই কেবল সেই সারিগুলি আপডেট করতে।

DECLARE @expense_report_id AS INT
SET @expense_report_id = 1027

--UPDATE expense_report_detail_distribution
--SET service_bill_id = 9

SELECT *
FROM expense_report_detail_distribution erdd
INNER JOIN expense_report_detail erd
INNER JOIN expense_report er 
    ON er.expense_report_id = erd.expense_report_id 
    ON erdd.expense_report_detail_id = erd.expense_report_detail_id
WHERE er.expense_report_id = @expense_report_id

2
    UPDATE mytable
         SET myfield = CASE other_field
             WHEN 1 THEN 'value'
             WHEN 2 THEN 'value'
             WHEN 3 THEN 'value'
         END
    From mytable
    Join otherTable on otherTable.id = mytable.id
    Where othertable.somecolumn = '1234'

আরও বিকল্প এখানে


0

আর একটি পদ্ধতির মার্জ ব্যবহার করা হবে

  ;WITH cteTable1(CalculatedColumn, CommonField)
  AS
  (
    select CalculatedColumn, CommonField from Table1 Where BatchNo = '110'
  )
  MERGE cteTable1 AS target
    USING (select "Calculated Column", "Common Field" FROM dbo.Table2) AS source ("Calculated Column", "Common Field")
    ON (target.CommonField = source."Common Field")
    WHEN MATCHED THEN 
        UPDATE SET target.CalculatedColumn = source."Calculated Column";

মার্জ এসকিউএল স্ট্যান্ডার্ডের একটি অংশ

-Also আমি প্রায় নিশ্চিত ভেতরের আছি যে বিষয়ে জবাব দিতে কোথায় আলোচনা যোগদান আপডেট অ নির্ণায়ক হয় .. একই প্রশ্ন এখানে http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query। এইচটিএমএল


3
যদিও তারা মানসম্পন্ন হতে পারে তবে আমি খুব যত্নবান হতে পারিMERGE
অ্যারন বার্ট্র্যান্ড

1
যা সব ধরণের মজার কারণ আক্ষরিক অর্থে 5 মিনিট পোস্ট করার পরে আমি স্প্রোকগুলিতে উত্তরাধিকার সূত্রে প্রাপ্ত কিছু সমস্যাবিহীন অ-সংজ্ঞাবহ আপডেটের বিষয়ে ঘটলাম :-) মজাদার জিনিস
শ্যান

এটি মার্জকে আরও ভাল করে না, এর অর্থ কেবল আপনার খারাপ আপডেট রয়েছে।
অ্যারন বারট্রান্ড

1
হ্যাঁ, আমি কেবল অদ্ভুত ছিলাম :-) আমার মস্তিষ্কে এটি ছিল যখন আমি আবার স্প্রোকটিতে ডুব দিয়েছিলাম এবং এটি প্রথম জিনিস আমি দেখেছি।
শেন

2
সিটিই স্ট্যান্ডার্ড; বোকা নামগুলি থেকে বাঁচার জন্য বর্গাকার বন্ধনীগুলি নয় (ডাবল উদ্ধৃতি হয়)।
onedaywhen

0

আমার একই সমস্যা ছিল .. এবং আপনার কোনও শারীরিক কলাম যুক্ত করার দরকার নেই .. এখন আপনাকে এটি বজায় রাখতে হবে .. আপনি যা করতে পারেন তা নির্বাচিত ক্যোয়ারিতে একটি জেনেরিক কলাম যুক্ত করুন:

গো EX:

select tb1.col1, tb1.col2, tb1.col3 ,
( 
select 'Match' from table2 as tbl2
where tbl1.col1 = tbl2.col1 and tab1.col2 = tbl2.col2
)  
from myTable as tbl1

0

উপরের হারুনের দৃষ্টিভঙ্গি আমার পক্ষে পুরোপুরি কার্যকর হয়েছিল। আমার আপডেটের বিবৃতিটি কিছুটা আলাদা ছিল কারণ অন্য টেবিলে কোনও ক্ষেত্রের সাথে মেলে একটি টেবিলের সাথে দুটি ক্ষেত্রের সংমিশ্রণের ভিত্তিতে আমার যোগদানের প্রয়োজন হয়েছিল।

 --update clients table cell field from custom table containing mobile numbers

update clients
set cell = m.Phone
from clients as c
inner join [dbo].[COSStaffMobileNumbers] as m 
on c.Last_Name + c.First_Name = m.Name

-3

চেষ্টা করুন:

UPDATE table1
SET CalculatedColumn = ( SELECT [Calculated Column] 
                         FROM table2 
                         WHERE table1.commonfield = [common field])
WHERE  BatchNO = '110'

6
আমি নিম্নগামী, কারণ এটি প্রতিটি সারি আপডেট করবে table1, কেবল যে সারিগুলি উভয় টেবিলের মধ্যে সাধারণ ক্ষেত্রের সাথে মিল নেই (কার্যকরভাবে একটি বাম জোড় এবং অভ্যন্তরীণ যোগদান নয়)।
সি

@ সিᴏʀʏ: আপনি বোঝাতে চেয়েছেন যে এটি প্রতিটি সারি মিলে আপডেট করবে BatchNo = '110', তাই না? ডাউনভোটগুলির সমস্ত কি এই প্রভাবের ফলস্বরূপ এসেছিল বা অন্যদের ডাউন-ভোটিংয়ের অন্যান্য কারণ রয়েছে?
পালসুইম

আমি জিজ্ঞাসা করছি কারণ কেউ কেউ গ্রহণ করতে পারে যে হালনাগাদ করা অপারেশনটি কিছু সারি সেট NULLকরতে পারে এবং এই ফর্মটি কম টি-এসকিউএল নির্দিষ্ট সমাধান হতে পারে।
পালসুইম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.