مبادئ - مقدمة عن sql server




تحديث SQL من جدول لآخر بناءً على مطابقة الرقم التعريفي (14)

لدي قاعدة بيانات تحتوي على account numbers card numbers . أقوم بمطابقتها مع ملف update أي أرقام بطاقات لرقم الحساب ، حتى أتعامل فقط مع أرقام الحسابات.

لقد قمت بإنشاء عرض يربط الجدول بقاعدة بيانات الحساب / البطاقة لإرجاع Table ID الحساب ذي الصلة ، والآن أحتاج إلى تحديث هذه السجلات حيث يطابق الرقم التعريفي مع رقم الحساب.

هذا هو جدول Sales_Import ، حيث يلزم تحديث حقل account number :

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

وهذا هو جدول RetrieveAccountNumber ، حيث أحتاج إلى التحديث من:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

جربت ما يلي ، ولكن لم يحالفني الحظ حتى الآن:

UPDATE [Sales_Lead].[dbo].[Sales_Import] 
SET    [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  [Sales_Lead].[dbo].[Sales_Import]. LeadID = 
                                                RetrieveAccountNumber.LeadID) 

يقوم بتحديث أرقام البطاقات إلى أرقام الحسابات ، ولكن يتم استبدال أرقام الحسابات بـ NULL


أدناه اقترح شخص SQL ، لا يعمل في SQL Server. تذكرني هذه الجملة بفرعي في المدرسة القديمة:

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

لا نوصي جميع الاستعلامات الأخرى باستخدام NOT IN أو NOT EXISTS . تظهر القيم الخالية لأن OP يقارن مجموعة البيانات بأكملها مع مجموعة فرعية أصغر ، ثم بالطبع ستكون هناك مشكلة في المطابقة. يجب أن يتم إصلاح ذلك عن طريق كتابة SQL المناسبة مع JOIN الصحيح بدلاً من التهرب من المشكلة باستخدام NOT IN . قد تواجه مشاكل أخرى باستخدام NOT IN أو NOT EXISTS في هذه الحالة.

تصويتي لأعلى واحد ، وهو الطريقة التقليدية لتحديث جدول يستند إلى جدول آخر عن طريق الانضمام في SQL Server. كما قلت ، لا يمكنك استخدام جدولين في نفس UPDATE في SQL Server ما لم تنضم إليهم أولاً.


أريد إضافة هذا التحديث للحصول على رمز SQL Access أو VBA: لدينا للقيام JOIN قبل SET.

وصول SQL

UPDATE
    Sales_Import
INNER JOIN
    RetrieveAccountNumber 
ON 
    Sales_Import.LeadID = RetrieveAccountNumber.LeadID
SET
    Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;

أود إضافة شيء إضافي واحد.

لا تقم بتحديث قيمة بنفس القيمة ، فإنه ينشئ تسجيل إضافية و مقدار الحمل غير الضرورية. انظر المثال أدناه - لن يؤدي إلا إلى إجراء التحديث في سجلين على الرغم من الربط على 3.

DROP TABLE #TMP1
DROP TABLE #TMP2
CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))

INSERT INTO #TMP1 VALUES
(147,'5807811235')
,(150,'5807811326')
,(185,'7006100100007267039');

INSERT INTO #TMP2 VALUES
(147,'7006100100007266957')
,(150,'7006100100007267039')
,(185,'7006100100007267039');

UPDATE A
SET A.AccountNumber = B.AccountNumber
FROM
    #TMP1 A 
        INNER JOIN #TMP2 B
        ON
        A.LeadID = B.LeadID
WHERE
    A.AccountNumber <> B.AccountNumber  --DON'T OVERWRITE A VALUE WITH THE SAME VALUE

SELECT * FROM #TMP1

إجابة عامة للمطورين في المستقبل.

خادم قاعدة البيانات

UPDATE 
     t1
SET 
     t1.column = t2.column
FROM 
     Table1 t1 
     INNER JOIN Table2 t2 
     ON t1.id = t2.id;

أوراكل (و SQL Server)

UPDATE 
     t1
SET 
     t1.colmun = t2.column 
FROM 
     Table1 t1, 
     Table2 t2 
WHERE 
     t1.ID = t2.ID;

الخلية

UPDATE 
     Table1 t1, 
     Table2 t2
SET 
     t1.column = t2.column 
WHERE
     t1.ID = t2.ID;

استخدم كتلة الاستعلام التالية لتحديث Table1 مع Table2 استنادًا إلى المعرّف:

UPDATE Sales_Import, RetrieveAccountNumber 
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;

هذه هي أسهل طريقة لمعالجة هذه المشكلة.


اعتقدت أن هذا مثال بسيط قد يساعد شخص ما على تسهيل الأمر ،

        DECLARE @TB1 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        DECLARE @TB2 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        INSERT INTO @TB1 VALUES(1,'asdf');
        INSERT INTO @TB1 VALUES(2,'awerq');


        INSERT INTO @TB2 VALUES(1,';oiup');
        INSERT INTO @TB2 VALUES(2,'lkjhj');

        SELECT * FROM @TB1

        UPDATE @TB1 SET Name =S.Name
        FROM @TB1 T
        INNER JOIN @TB2 S
                ON S.No = T.No

        SELECT * FROM @TB1

الطريقة البسيطة لنسخ المحتوى من جدول إلى آخر هي كما يلي:

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

يمكنك أيضًا إضافة الشرط للحصول على البيانات المحددة التي تم نسخها.


انها تعمل مع postgresql

UPDATE application
SET omts_received_date = (
    SELECT
        date_created
    FROM
        application_history
    WHERE
        application.id = application_history.application_id
    AND application_history.application_status_id = 8
);

بالنسبة إلى MySql يعمل بشكل جيد:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID

بالنسبة لـ SQL Server 2008 + باستخدام MERGE بدلاً من UPDATE ... FROM الملكية UPDATE ... FROM يحتوي بناء الجملة UPDATE ... FROM على بعض النداء.

بالإضافة إلى كونها SQL قياسية وبالتالي أكثر قابلية للحمل فإنها سترفع خطأ في حالة وجود صفوف ملتصقة متعددة على الجانب المصدر (وبالتالي عدة قيم مختلفة ممكنة لاستخدامها في التحديث) بدلاً من أن تكون النتيجة النهائية غير محددة .

MERGE INTO Sales_Import
   USING RetrieveAccountNumber
      ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
   UPDATE 
      SET AccountNumber = RetrieveAccountNumber.AccountNumber;

لسوء الحظ ، قد لا ينزل خيار الاستخدام إلى الأسلوب المفضل فقط. وقد تم تنفيذ تطبيق MERGE في SQL Server مع البق المختلفة. قام آرون بيرتراند بتجميع قائمة بالأسماء التي تم الإبلاغ عنها هنا .


شكرا على الردود. لقد وجدت حل مع ذلك.

UPDATE Sales_Import 
SET    AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  Sales_Import.leadid =RetrieveAccountNumber.LeadID) 
WHERE Sales_Import.leadid = (SELECT  RetrieveAccountNumber.LeadID 
                             FROM   RetrieveAccountNumber 
                             WHERE  Sales_Import.leadid = RetrieveAccountNumber.LeadID)  

كان لي نفس المشكلة مع foo.new يتم تعيينها إلى الصفوف لصفوف foo التي ليس لها مفتاح مطابق في bar . فعلت شيء من هذا القبيل في أوراكل:

update foo
set    foo.new = (select bar.new
                  from bar 
                  where foo.key = bar.key)
where exists (select 1
              from bar
              where foo.key = bar.key)

يبدو أنك تستخدم MSSQL ، إذا تذكرت بشكل صحيح ، يتم ذلك على النحو التالي:

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID

جرب هذا :

UPDATE
    Table_A
SET
    Table_A.AccountNumber = Table_B.AccountNumber ,
FROM
    dbo.Sales_Import AS Table_A
    INNER JOIN dbo.RetrieveAccountNumber AS Table_B
        ON Table_A.LeadID = Table_B.LeadID 
WHERE
    Table_A.LeadID = Table_B.LeadID




sql-update