মাইএসকিউএল - নির্বাচন অনুসন্ধানের উপর ভিত্তি করে আপডেট আপডেট


501

তারিখ-সময়ের উপর ভিত্তি করে দুটি ইভেন্টের মধ্যে কোনও সমিতি রয়েছে কিনা তা আমাকে একই টেবিলে পরীক্ষা করতে হবে।

এক সেট ডেটাতে নির্দিষ্ট ইভেন্টের শেষের তারিখের সময় থাকবে এবং অন্যান্য সেট ডেটাতে অন্যান্য ইভেন্টের জন্য শুরু হওয়ার তারিখের সময় থাকবে।

যদি প্রথম ইভেন্টটি দ্বিতীয় ইভেন্টের আগে শেষ হয় তবে আমি তাদের লিঙ্ক আপ করতে চাই।

আমার এখন পর্যন্ত যা আছে তা হ'ল:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1


SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2

তারপরে আমি তাদের সাথে যোগ দেব:

SELECT name_A, name_B, id_A, id_B, 
if(start_DTS > end_DTS,'VALID','') as validation_check
FROM tableA
LEFT JOIN tableB ON name_A = name_B

আমি তখন কি আমার বৈধতা-পরীক্ষা ক্ষেত্রের উপর ভিত্তি করে, নির্বাচন বাছাই করে একটি আপডেটের ক্যোয়ারী চালাতে পারি?


2
আমি নিশ্চিত না আপনি কি জিজ্ঞাসা করছেন? আপনি কী কী কোনও এসকিউএল সিলেক্ট করে একটি আপডেট করবেন তা বোঝার চেষ্টা করছেন?
রিডলারডেভ

উত্তর:


810

আপনি দুটি উপায়ের মধ্যে এটি একটি করতে পারেন:

মাইএসকিউএল আপডেট সিনট্যাক্স যোগ দিন:

UPDATE tableA a
INNER JOIN tableB b ON a.name_a = b.name_b
SET validation_check = if(start_dts > end_dts, 'VALID', '')
-- where clause can go here

এএনএসআই এসকিউএল সিনট্যাক্স:

UPDATE tableA SET validation_check = 
    (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check
        FROM tableA
        INNER JOIN tableB ON name_A = name_B
        WHERE id_A = tableA.id_A)

যে কোনও একটি আপনার কাছে সবচেয়ে স্বাভাবিক মনে হয় তা চয়ন করুন।


92
প্রথম ফর্ম (যোগদানের সাথে আপডেট) দ্বিতীয়টির চেয়ে অনেক বেশি দক্ষ হতে চলেছে। প্রথমটি একটি একক যোগদান করবে, যেখানে দ্বিতীয়টি টেবিএর প্রতিটি সারিটির জন্য নির্বাচিত কোয়েরি সম্পাদন করবে।
কলিনম

16
প্রথম উদাহরণ হিসাবে, আপনি কি অভ্যন্তরীণ যোগদান ব্যবহার করবেন না? বৈধতা যাচাইয়ের ফলাফলের সাথে বৈধতা যাচাই-বাছাইয়ের জন্য কোনও টেবিলবি রেকর্ড ছাড়াই টেবিলএ রেকর্ডের জন্য বাতিল হয়ে যাবে?
সেরিন

3
@ সেরিন হ্যাঁ আমার সাথে এটি ঘটেছে। এটি অভ্যন্তরীণ যোগদান করা উচিত! বা এটি যোগদান হিসাবে ছেড়ে দিন। যদি আপনার অভ্যন্তরীণ যোগদান না থাকে তবে বাম জোয়ারের অর্থ টেবিলএর সমস্ত রেকর্ড আপডেট হবে! এটা খুব বিপজ্জনক!
সিএমসিডিগ্রাগনকাই

10
প্রথম (y) এর জন্য ধন্যবাদ যদিও এই উত্তরটি 7 বছরেরও বেশি পুরানো। আমি বিশ্বাস করতে পারি না কেন কেন নুন বলেছেন যে দ্বিতীয়টি কিছু মাইএসকিউএল এর মতো ডাটাবেসে কাজ করে না। আপনি এই ত্রুটিটি পাবেন:You can't specify target table ___ for update in FROM clause SQL.sql
জুগালি লাকোটা

1
এছাড়াও, নোট করুন যে সম্প্রতি অবধি, প্রথম পদ্ধতির মাইএসকিউএল যখন tableA= যখন কাজ করে না tableB। মধ্যবর্তী ফলাফল সংরক্ষণের জন্য আপনি একটি অস্থায়ী টেবিল তৈরি করতে বাধ্য হয়েছেন। (একটি মাইগ্রেশন স্ক্রিপ্টের জন্য অনুরূপ ক্যোয়ারী লিখতে হয়েছিল)
svvac

301
UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

আশা করি এটি আপনার পক্ষে কাজ করে।


5
এটি এখন পর্যন্ত সবচেয়ে দ্রুততম ক্যোয়ারী। সম্পাদনা করুন: 22K সারিগুলির সাথে ভাগ্য এবং 4K সারিগুলির সাথে src রয়েছে, এটি সম্পূর্ণ করতে 1 সেকেন্ডের নিচে নেমেছে, যখন শীর্ষের উত্তরটি 60 সেকেন্ডেরও বেশি।
ক্রিস দেব

1
হ্যাঁ, এটিই দ্রুততম ক্যোয়ারী,
বিটিডাব্লু

1
দ্রুততম সবসময় ভাল বোঝায় না, এই আপডেটটি সব ক্ষেত্রেই কাজ করবে না, আসলে কিছু ক্ষেত্রে আপনার অপ্রত্যাশিত আচরণ হবে, এই কারণেই কোনও শর্ত রাখা হয়নি এবং এটি একটি যোগদান নয়
এমিলিয়ানো


58

যদি কেউ কোনও ডাটাবেস থেকে অন্য ডাটাবেসে ডেটা আপডেট করার চেষ্টা করে তবে তারা কোন টেবিলটিকে লক্ষ্য করে তা নির্ধারণ করার জন্য, কিছু করার জন্য অবশ্যই কিছু মানদণ্ড থাকতে হবে।

এটি সর্বস্তরের জন্য আরও ভাল এবং পরিষ্কার:

UPDATE dbname1.content targetTable

LEFT JOIN dbname2.someothertable sourceTable ON
    targetTable.compare_field= sourceTable.compare_field
SET
    targetTable.col1  = sourceTable.cola,
    targetTable.col2 = sourceTable.colb, 
    targetTable.col3 = sourceTable.colc, 
    targetTable.col4 = sourceTable.cold 

Traaa! এটি দুর্দান্ত কাজ করে!

উপরের বোঝাপড়ার সাথে, আপনি আপনার কাজ করার জন্য সেট ক্ষেত্রগুলি এবং "চালু" মানদণ্ডটি পরিবর্তন করতে পারেন। আপনি চেকগুলি সম্পাদন করতে পারেন, তারপরে অস্থায়ী টেবিলের মধ্যে ডেটা টানুন এবং তারপরে আপনার টেবিল এবং কলামের নামগুলি প্রতিস্থাপন করে উপরের সিনট্যাক্সটি ব্যবহার করে আপডেটটি চালান।

আশা করি এটি কাজ করে, যদি আমাকে না জানায়। আমি আপনার জন্য একটি সঠিক কোয়েরি লিখব।


24
UPDATE 
  receipt_invoices dest,
  (
    SELECT 
      `receipt_id`,
      CAST((net * 100) / 112 AS DECIMAL (11, 2)) witoutvat 
    FROM
      receipt 
    WHERE CAST((net * 100) / 112 AS DECIMAL (11, 2)) != total 
      AND vat_percentage = 12
  ) src 
SET
  dest.price = src.witoutvat,
  dest.amount = src.witoutvat 
WHERE col_tobefixed = 1 
  AND dest.`receipt_id` = src.receipt_id ;

আশা করি এটি আপনাকে এমন কোনও ক্ষেত্রে সহায়তা করবে যেখানে আপনাকে দুটি টেবিলের মধ্যে মিল করতে হবে এবং আপডেট করতে হবে।


12

খুব জটিল যোগদানের জন্য আমার নিজের সমাধান অনুসন্ধান করতে আমি এই প্রশ্নটি পেয়েছি। সমস্যাটির আরও জটিল সংস্করণের এটি একটি বিকল্প সমাধান, যা আমি মনে করি এটি কার্যকর হতে পারে।

আমার ক্রিয়াকলাপ সারণীতে product_id ক্ষেত্রটি পপুলেশন করা দরকার, যেখানে ক্রিয়াকলাপগুলি একটি ইউনিটে সংখ্যাযুক্ত এবং ইউনিটগুলিকে একটি স্তরে সংখ্যাযুক্ত (একটি স্ট্রিং ?? এন ব্যবহার করে চিহ্নিত করা হয়েছে), যেমন কোনও এসকিউ ব্যবহার করে কার্যকলাপগুলি সনাক্ত করতে পারে অর্থাৎ L1U1A1। তারপরে এই এসকিউগুলি আলাদা টেবিলে সংরক্ষণ করা হয়।

আমি ক্রিয়াকলাপ_আইড বনাম পণ্য_ আইডির তালিকা পেতে নিম্নলিখিতগুলি সনাক্ত করেছি: -

SELECT a.activity_id, w.product_id 
  FROM activities a 
  JOIN units USING(unit_id) 
  JOIN product_types USING(product_type_id) 
  JOIN web_products w 
    ON sku=CONCAT('L',SUBSTR(product_type_code,3), 'U',unit_index, 'A',activity_index)

আমি দেখতে পেলাম যে এটি মাইএসকিএল-এর মধ্যে একটি নির্বাচনকে অন্তর্ভুক্ত করা খুব জটিল ছিল, তাই আমি একটি অস্থায়ী টেবিল তৈরি করেছি এবং আপডেটের বিবৃতি দিয়ে এতে যোগদান করেছি: -

CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>);

UPDATE activities a
  JOIN activity_product_ids b
    ON a.activity_id=b.activity_id 
  SET a.product_id=b.product_id;

আমি আশা করি যে কেউ এই দরকারী খুঁজে পেয়েছে


দুটি ক্যোয়ারী মাল্টি থ্রেড পরিবেশে ধারাবাহিক ফলাফল না দিতে পারে।
ডোনাল্ড

7
UPDATE [table_name] AS T1,
      (SELECT [column_name] 
        FROM [table_name] 
        WHERE [column_name] = [value]) AS T2 
  SET T1.[column_name]=T2.[column_name] + 1
WHERE T1.[column_name] = [value];

4

আপনি এই জাতীয় অভ্যন্তরীণ যোগদানের ব্যবহার করে অন্য টেবিল থেকে মানগুলি আপডেট করতে পারেন

UPDATE [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2.[column1_name] SET t1.[column2_name] = t2.column2_name];

এই কোয়েরিটি কীভাবে ব্যবহার করতে হয় তা জানতে এখানে অনুসরণ করুন http://www.voidtricks.com/mysql-inner-join-update/

অথবা আপনি এটি করতে subquery হিসাবে নির্বাচন ব্যবহার করতে পারেন

UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value];

কোয়েরি বিশদে এখানে ব্যাখ্যা করা হয়েছে http://www.voidtricks.com/mysql-update-from-select/


4

তুমি ব্যবহার করতে পার:

UPDATE Station AS st1, StationOld AS st2
   SET st1.already_used = 1
 WHERE st1.code = st2.code

3

একই টেবিলের জন্য,

UPDATE PHA_BILL_SEGMENT AS PHA,
     (SELECT BILL_ID, COUNT(REGISTRATION_NUMBER) AS REG 
       FROM PHA_BILL_SEGMENT
        GROUP BY REGISTRATION_NUMBER, BILL_DATE, BILL_AMOUNT
        HAVING REG > 1) T
    SET PHA.BILL_DATE = PHA.BILL_DATE + 2
 WHERE PHA.BILL_ID = T.BILL_ID;

1

এক টেবিলের মধ্যেই সদৃশ এন্ট্রি নিয়ে আমার একটি সমস্যা ছিল। নীচে আমার জন্য কাজ করা পন্থাগুলি রয়েছে। এটি @ সিবাজ দ্বারাও আইনজীবী হয়েছে।

অবশেষে আমি নীচের প্রশ্নগুলি ব্যবহার করে এটি সমাধান করেছি:

  1. নির্বাচিত ক্যোয়ারী একটি অস্থায়ী সারণীতে সংরক্ষণ করা হয়

    IF OBJECT_ID(N'tempdb..#New_format_donor_temp', N'U') IS NOT NULL
        DROP TABLE #New_format_donor_temp;
    
    select *
    into #New_format_donor_temp
    from DONOR_EMPLOYMENTS
    where DONOR_ID IN (
      1, 2
    )
    
    -- Test New_format_donor_temp
    -- SELECT *
    -- FROM #New_format_donor_temp;
  2. টেম্প টেবিল আপডেট ক্যোয়ারিতে যোগদান করা হয়েছে।

    UPDATE de
    SET STATUS_CD=de_new.STATUS_CD, STATUS_REASON_CD=de_new.STATUS_REASON_CD, TYPE_CD=de_new.TYPE_CD
    FROM DONOR_EMPLOYMENTS AS de
      INNER JOIN #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO
    WHERE
      de.DONOR_ID IN (
        3, 4
    )

আমি এসকিউএল এর সাথে খুব অভিজ্ঞ নই দয়া করে আপনার জানা কোনও ভাল পদ্ধতির পরামর্শ দিন।

উপরে অনুসন্ধানগুলি মাইএসকিউএল সার্ভারের জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.