sql - यवस - एसक्यूएल में जॉइन के साथ मैं एक अद्यतन स्टेटमेंट कैसे कर सकता हूं?




हिंदी में डेटाबेस डिजाइन की प्रक्रिया (9)

माई एसक्यूएल

यदि आप कहां भूल जाते हैं और ऑन एक्सप्रेशन में सभी स्थितियों को रखते हैं तो आपको सर्वश्रेष्ठ प्रदर्शन मिलेगा।

मुझे लगता है कि ऐसा इसलिए है क्योंकि क्वेरी को पहले टेबल में शामिल होना पड़ता है, उस पर उस खंड को चलाता है, इसलिए यदि आप शामिल होने के लिए आवश्यक चीज़ों को कम कर सकते हैं तो परिणाम प्राप्त करने के लिए तेज़ तरीका है।

उदाहरण

परिदृश्य

आपके पास उपयोगकर्ताओं की एक टेबल है। वे अपने उपयोगकर्ता नाम या ईमेल या account_number का उपयोग कर लॉग इन कर सकते हैं। ये खाते सक्रिय (1) या निष्क्रिय (0) हो सकते हैं। इस तालिका में 50000 पंक्तियां हैं

फिर आपके पास एक बार में अक्षम होने के लिए उपयोगकर्ताओं की एक तालिका है क्योंकि आप पाते हैं कि उन्होंने सब कुछ खराब कर दिया है। हालांकि, इस तालिका में उपयोगकर्ता नाम, ईमेल और खाता संख्या मिश्रित एक कॉलम है। इसमें "has_run" संकेतक भी है जिसे इसे चलाने पर 1 (सत्य) पर सेट करने की आवश्यकता होती है

सवाल

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

विचार

अगर हमें केवल या शर्तों पर शामिल होना पड़ा तो इसे अनिवार्य रूप से प्रत्येक पंक्ति को 4 बार जांचने की आवश्यकता होगी ताकि यह देखने के लिए कि इसमें शामिल होना चाहिए, और संभावित रूप से बहुत अधिक पंक्तियां वापस करनी होंगी। हालांकि, इसे और अधिक शर्तों देकर यदि वे शामिल होने पर सभी शर्तों को पूरा नहीं करते हैं तो यह कई पंक्तियों को "छोड़" सकता है।

बोनस

यह और अधिक पठनीय है। सभी शर्तें एक ही स्थान पर हैं और अपडेट करने वाली पंक्तियां एक ही स्थान पर हैं

मुझे इस तालिका को SQL Server 2005 अपने 'पैरेंट' तालिका से डेटा के साथ अपडेट करने की आवश्यकता है, नीचे देखें:

बिक्री

id (int)
udid (int)
assid (int)

उद

id  (int)
assid  (int)

sale.assid में sale.assid को अपडेट करने के लिए सही मान होता है।

यह क्या प्रश्न करेगा? मैं एक join सोच रहा हूं लेकिन मुझे यकीन नहीं है कि यह संभव है।


FROM कीवर्ड के साथ निम्न कथन का उपयोग शामिल होने के साथ कई पंक्तियों को अपडेट करने के लिए किया जाता है

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

एक और उदाहरण क्यों एसक्यूएल वास्तव में पोर्टेबल नहीं है।

MySQL के लिए यह होगा:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

अधिक जानकारी के लिए एकाधिक तालिका अद्यतन पढ़ें: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

एक मानक एसक्यूएल दृष्टिकोण होगा

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

SQL सर्वर पर आप एक जॉइन का उपयोग कर सकते हैं

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

टेराडाटा एस्टर लक्ष्य को प्राप्त करने का एक और दिलचस्प तरीका प्रदान करता है:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

मैं सोच रहा था कि शीर्ष पोस्ट में एसक्यूएल-सर्वर एक सिबेज के लिए काम करेगा क्योंकि वे दोनों टी-एसक्यूएल हैं लेकिन दुर्भाग्य से नहीं।

Sybase के लिए मैंने पाया कि अद्यतन तालिका पर ही होना चाहिए उपनाम नहीं:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

सिंटेक्स सख्ती से निर्भर करता है कि आप किस SQL ​​डीबीएमएस का उपयोग कर रहे हैं। एएनएसआई / आईएसओ (उर्फ किसी भी एसक्यूएल डीबीएमएस पर काम करना चाहिए), MySQL, SQL सर्वर, और ओरेकल में ऐसा करने के कुछ तरीके यहां दिए गए हैं। सलाह दीजिये कि मेरा सुझाया गया एएनएसआई / आईएसओ विधि आमतौर पर अन्य दो तरीकों से बहुत धीमी होगी, लेकिन यदि आप MySQL, SQL सर्वर, या ओरेकल के अलावा SQL DBMS का उपयोग कर रहे हैं, तो यह जाने का एकमात्र तरीका हो सकता है (उदाहरण के लिए यदि आपका एसक्यूएल डीबीएमएस MERGE समर्थन नहीं करता है):

एएनएसआई / आईएसओ:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

माई एसक्यूएल:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

एस क्यू एल सर्वर:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

आकाशवाणी:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID




sql-update