যোগদান করে এসকিউএল আপডেট ক্যোয়ারী


664

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

উদাহরণ:

select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34

আমি উপরের শর্তে যোগদান করা কিছু অন্যান্য মান সহ mf_item_numberটেবিলের ক্ষেত্রের মানগুলি আপডেট করতে চাই item_master

এমএস এসকিউএল সার্ভারে আমি কীভাবে এটি করতে পারি?


124
দয়া করে শুরু হওয়ার জন্য এই অন্তর্ভুক্ত যোগদানগুলিকে ব্যবহার বন্ধ করুন। এটি একটি দুর্বল কৌশল যা অপ্রত্যাশিত ক্রস যোগদানের কারণে ভুল ফলাফলের দিকে পরিচালিত করে। এই কোড শৈলীটি 18 বছরের
পুরানো

2
আরও দেখুন তাই প্রশ্ন ... stackoverflow.com/questions/1293330/...
SteveC

উত্তর:


1251
UPDATE im
SET mf_item_number = gm.SKU --etc
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34

এটি পরিষ্কার করার জন্য ... UPDATEধারাটি ধারাটিতে নির্দিষ্ট করা একটি টেবিলের নামটি উল্লেখ করতে পারে FROM। সুতরাং imএই ক্ষেত্রে কার্যকর

জেনেরিক উদাহরণ

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...

9
পোস্টগ্রিস সম্পর্কে অভিযোগ UPDATE im; আমি এমন একটি উপাধি যা
পোস্টগ্র্রেস

10
এফওয়াইআই এটি মাইএসকিউএলে (বিভিন্ন সিনট্যাক্স) কাজ করবে না ! মাইএসকিউএল জন্য gcbenison এর উত্তর কটাক্ষপাত আছে
Sliq

67

সবচেয়ে সহজ উপায় হ'ল একটি সাধারণ টেবিল এক্সপ্রেশন ব্যবহার করা (যেহেতু আপনি ইতিমধ্যে এসকিউএল 2005 এ রয়েছেন):

with cte as (
select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
    , <your other field>
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34)
update cte set mf_item_number = <your other field>

ক্যোয়ারী এক্সিকিউশন ইঞ্জিনটি কীভাবে রেকর্ডটি আপডেট করতে হবে তা নিজেরাই নির্ধারণ করবে।


8
দুর্দান্ত,
সিটিইর ব্যবহারটি

4
আপনার নির্বাচিত ক্যোয়ারিতে যতক্ষণ না কোনও সমষ্টি, DISTINCT ইত্যাদি থাকে না ততক্ষণ কাজ করে
বাওদাদ

1
পূর্ববর্তী বিবৃতি (যদি থাকে তবে) শেষ করতে আমি সাধারণত সেমিকোলন দিয়ে শুরু করি। সিটিই রক! জটিল ক্যোয়ারী ডিজাইন করা সহজ / আপডেট হওয়া আপডেট। আমি এটি সর্বদা ব্যবহার করি ...
অ্যাডাম ডব্লিউ

64

এটিকে মাইএসকিউএলে রূপান্তর করা - এর মধ্যে কোনও FROMধারা নেই UPDATEতবে এটি কাজ করে:

UPDATE
    item_master im
    JOIN
    group_master gm ON im.sku=gm.sku 
    JOIN
    Manufacturer_Master mm ON gm.ManufacturerID=mm.ManufacturerID
SET
    im.mf_item_number = gm.SKU --etc
WHERE
    im.mf_item_number like 'STA%'
    AND
    gm.manufacturerID=34

12

উপরে আপনার স্কয়ার ব্যবহার করেন নি তবে এখানে যোগদানের বিবৃতিটির ভিত্তিতে একটি সারণী আপডেট করার উদাহরণ।

UPDATE p
SET    p.category = c.category
FROM   products p
       INNER JOIN prodductcatagories pg
            ON  p.productid = pg.productid
       INNER JOIN categories c
            ON  pg.categoryid = c.cateogryid
WHERE  c.categories LIKE 'whole%'

8

আপডেট আপডেটের বিবৃতিতে "FROM" ধারাটি কীভাবে এবং কী আপডেট করতে হবে তা নির্ধারণে আপনি অতিরিক্ত সারণি নির্দিষ্ট করতে পারেন:

update item_master
set mf_item_number = (some value)
from 
   group_master as gm
   join Manufacturar_Master as mm ON ........
where
 .... (your conditions here)

WHERE ধারাটিতে আপনার এই শর্তগুলি সরবরাহ করার জন্য শর্তাদি সরবরাহ এবং ক্রিয়াকলাপে যোগদান করতে হবে।

আঙ্গুরের ছিরড়া



5
হ্যাঁ অনুগ্রহ করে আনসির সাথে যোগ দিন, আপনি যদি কোনও দুর্ঘটনাক্রমে ক্রস জয়েন হয়ে থাকে তবে আপনি কোনও আপডেটে আসল সমস্যায় পড়তে পারেন।
এইচএলজিইএম

7

মাইএসকিউএল: সাধারণভাবে আপনার প্রয়োজনের তুলনায় প্রয়োজনীয় পরিবর্তনগুলি করুন:

UPDATE
    shopping_cart sc
    LEFT JOIN
    package pc ON sc. package_id = pc.id    
SET
    sc. amount = pc.amount


2

আপনি নিম্নলিখিত কোয়েরি ব্যবহার করতে পারেন:

UPDATE im
SET mf_item_number = (some value) 
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34    `sql`

1

আপনি MERGEআরও বেশি নিয়ন্ত্রণের সাথে কমান্ডের সাহায্যে আপডেট করতে পারেন MATCHEDএবং NOT MATCHED: (আমি আমার বিষয়টি প্রদর্শনের জন্য উত্স কোডটি কিছুটা পরিবর্তন করেছি)

USE tempdb;
GO
IF(OBJECT_ID('target') > 0)DROP TABLE dbo.target
IF(OBJECT_ID('source') > 0)DROP TABLE dbo.source
CREATE TABLE dbo.Target
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Target_PK PRIMARY KEY ( EmployeeID )
    );
CREATE TABLE dbo.Source
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Source_PK PRIMARY KEY ( EmployeeID )
    );
GO
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Mary' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 101, 'Sara' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 102, 'Stefano' );

GO
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Bob' );
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 104, 'Steve' );
GO

SELECT * FROM dbo.Source
SELECT * FROM dbo.Target

MERGE Target AS T
USING Source AS S
ON ( T.EmployeeID = S.EmployeeID )
WHEN MATCHED THEN
    UPDATE SET T.EmployeeName = S.EmployeeName + '[Updated]';
GO 
SELECT '-------After Merge----------'
SELECT * FROM dbo.Source
SELECT * FROM dbo.Target
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.