এসকিউএল স্ট্রিংয়ে আমি কীভাবে 'যদি ক্লজ' রাখতে পারি?


189

তাই আমি এখানে আমার কি করতে চাই মাইএসকিউএল ডাটাবেসে ।

আমি করতে চাই:

SELECT *
    FROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING'

যে কোনো সারি, যার মাধ্যমে সম্ভব ফিরে না চান তাহলে if(dr.HasRows == false), আমি এখন একটি তৈরি করবে UPDATEমধ্যে purchaseOrderডাটাবেসের:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID'

আমি কীভাবে এই প্রক্রিয়াটিকে আরও ছোট করতে সক্ষম করব?


4
আইটেমগুলি অর্ডার করা ডাটাবেসের একটি অনন্য আইডি itemsOrdered_IDরয়েছে এবং এটি পুনরাবৃত্ত purchaseOrder_IDমানগুলি রাখে
জন আর্নেস্ট গুয়াদালাপে

1
অন্যদিকে purchaseorderডাটাবেসের অনন্য আইডি রয়েছেpurchaseOrder_ID
জন আর্নেস্ট গুয়াদালাপে

উত্তর:


408

আপনার নির্দিষ্ট প্রশ্নের জন্য, আপনি এটি করতে পারেন:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' and
          not exists (SELECT *
                      FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'
                     )

তবে, আমি অনুমান করতে পারি যে আপনি একটি উচ্চ স্তরে লুপ করছেন। এই জাতীয় সমস্ত মান সেট করতে, এটি চেষ্টা করুন:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE not exists (SELECT 1
                      FROM itemsOrdered
                      WHERE itemsOrdered.purchaseOrder_ID = purchaseOrder.purchaseOrdered_ID AND
                            status = 'PENDING'
                      limit 1
                     )

26
আসলে মাইএসকিউএল-এ, সংযুক্ত সাব-কোয়েরিটি সবচেয়ে দক্ষ পদ্ধতির মধ্যে হওয়া উচিত, ধরে নিই আইটেমঅর্ডারড.পুরচেস অর্ডার_আইডি-তে একটি সূচক রয়েছে।
গর্ডন লিনফ

8
@Eggyal । । আমি সম্মত হই যে কোনও সূচি ব্যতিরেকে পারস্পরিক সম্পর্কযুক্ত সংস্করণ যোগদানের চেয়ে কম পারফরম্যান্ট (বিভিন্ন কারণের উপর নির্ভর করে যেমন সারিগুলির গুণন)। একটি সূচক সহ, যদিও এটি যুক্ত হওয়ার চেয়ে ভাল হওয়া উচিত কারণ এটি প্রথম ম্যাচে সূচি স্ক্যান বন্ধ করে দেওয়া উচিত। পরীক্ষা করে দেখুন dev.mysql.com/doc/refman/5.5/en/...
গর্ডন লিনফ

53

আপনি এবং এর মধ্যে UPDATEপ্রভাব ফেলতে একাধিক-সারণি বাক্য গঠন ব্যবহার করতে পারেন :ANTI-JOINpurchaseOrderitemsOrdered

UPDATE purchaseOrder p LEFT JOIN itemsOrdered i
    ON p.purchaseOrder_ID = i.purchaseOrder_ID
   AND i.status = 'PENDING'
SET    p.purchaseOrder_status = 'COMPLETED'
WHERE  p.purchaseOrder_ID = '@purchaseOrder_ID'
   AND i.purchaseOrder_ID IS NULL

47

যেহেতু মাইএসকিউএল সমর্থন করে না if exists(*Your condition*) (*Write your query*), আপনি এইভাবে লিখে একটি 'যদি ক্লজ' অর্জন করতে পারেন:

(*Write your insert or update query*) where not exists (*Your condition*)

27

আপনি রেকর্ডটি বিদ্যমান কিনা তা পরীক্ষা করে নীচের ক্যোয়ারীটি ব্যবহার করতে পারেন এবং তারপরে এটি আপডেট করুন:

if not exists(select top 1 fromFROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING' )
Begin

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID

End

22
Select FROM t1
    WHERE s11 > ANY
        (SELECT col1,col2 FROM t2
            WHERE NOT EXISTS
                (SELECT * FROM t3
                    WHERE ROW(5*t2.s1,77)=
                        (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
                            (SELECT * FROM t5) AS t5)));

4
আমি কীভাবে প্রশ্নের উত্তর দিচ্ছি তা দেখার জন্য আমি লড়াই করছি?
মায়ার

1
@ মায়ার আমাকেও তবে এটি একটি দুর্দান্ত উত্তর
গ্যাব্রিয়েল

2
অভিনন্দন, আপনার কোড একটি অপ্রচলিত কোড হিসাবে নির্বাচন করা হয়েছে।
বিশ্বনাথ ডালভী 21'18

1
আমি অনুমান করি যে এটি ব্যবহার করে আমরা আর কী করতে পারি SQL
টপ-মাস্টার

13
if not exists(select top 1 fromFROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING' )
Begin

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID

End

7
আপনি যদি উত্তরটিও ব্যাখ্যা করেন তবে এটি দুর্দান্ত হবে, কেবল কোডের উত্তরগুলি ভবিষ্যতের ব্যবহারকারীদের জন্য সহায়ক নয়
কুমার সৌরভ

9

এসকিএল সার্ভার ২০০৮ এর পরে Mergeএকক ম্যাচের স্টেটমেন্টের ভিত্তিতে অপারেশন সন্নিবেশ, আপডেট এবং মুছতে সরবরাহ করে, এটি আপনাকে যোগদানের অনুমতি দেয়। নীচে নমুনা উদাহরণ আপনাকে সাহায্য করতে পারে।

MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID) 
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%' 
    THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
    THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;

এর মতো আপনি একটি বিবৃতিতে সন্নিবেশ, আপডেট এবং মুছতে পারেন।

এবং আরও তথ্যের জন্য আপনি https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx এ অফিসিয়াল ডকুমেন্টগুলি উল্লেখ করতে পারেন


7

যদি টেবিলটিতে কয়েক মিলিয়ন রেকর্ড থাকে তবে নীচের ক্যোয়ারী দ্রুত কাজ করবে।

UPDATE PO
SET PO.purchaseOrder_status = 'COMPLETED'
FROM purchaseOrder PO
LEFT OUTER JOIN itemsOrdered IOD ON IOD.purchaseOrder_ID = PO.purchaseOrdered_ID and IOD.status = 'PENDING'
WHERE IOD.purchaseOrder_ID IS NULL

1

আপনি নির্বাচিত প্রশ্নের মধ্যে ফেরত ফলাফলের সংখ্যা ধারণ করে একটি ভেরিয়েবল ঘোষণা করতে পারেন। তারপরে এই ভেরিয়েবলটি 0 এর বেশি হলে আপনি আপডেট স্টেটমেন্টটি চালাতে পারেন

    Declare @ResultCount int
    SELECT @ResultCount = count(*) FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'        
    If @ResultCount > 0
UPDATE purchaseOrder SET purchaseOrder_status = 'COMPLETED' WHERE purchaseOrder_ID = '@purchaseOrder_ID'        
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.