it-swarm.asia

كيف يمكنني القيام ببيان UPDATE مع JOIN في SQL؟

أحتاج إلى تحديث هذا الجدول في SQL Server 2005 مع البيانات من الجدول "الأصل" الخاص به ، انظر أدناه:

تخفيض السعر

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

ud

id  (int)
assid  (int)

sale.assid يحتوي على القيمة الصحيحة لتحديث ud.assid.

ما الاستعلام سوف تفعل هذا؟ أفكر في join ولكني لست متأكدًا مما إذا كان ذلك ممكنًا.

1194
Ant Swift

يعتمد بناء الجملة بدقة على SQL DBMS الذي تستخدمه. فيما يلي بعض الطرق للقيام بذلك في ANSI/ISO (يجب أن يعرف أيضًا باسم SQL DBMS) و MySQL و SQL Server و Oracle. يرجى العلم أن طريقة ANSI/ISO المقترحة ستكون عادة أبطأ بكثير من الطريقتين الأخريين ، لكن إذا كنت تستخدم SQL DBMS بخلاف MySQL أو SQL Server أو Oracle ، فقد تكون الطريقة الوحيدة للذهاب (على سبيل المثال إذا كان SQL DBMS الخاص بك لا يدعم MERGE):

ANSI/ISO:

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 ud
  set ud.assid = s.assid
from sale s 
where ud.id = s.udid;

لاحظ أنه يجب ألا يتكرر الجدول الهدف في جملة FROM لـ Postgres.

وحي:

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

سكليتي:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );
2178
Eric

يجب أن يعمل هذا في SQL Server:

update ud 
set assid = sale.assid
from sale
where sale.udid = id
131
edosoft

بوستجرس

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 
90
user1154043

سيكون نهج SQL القياسية

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

على SQL Server يمكنك استخدام صلة

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

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;
35
alfonx

استعلام تحديث مبسط باستخدامJOIN- ing جداول متعددة.

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

ملاحظة - first_table و second_table و third_table و some_column مثل 123456 هي أسماء الجداول التجريبية وأسماء الأعمدة والمعرفات. استبدالها مع أسماء صالحة.

22
Vinit Kadkol

مثال آخر لماذا SQL ليست محمولة حقا.

بالنسبة إلى 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]
13
Yada

يقدم Teradata Aster طريقة أخرى مثيرة للاهتمام حول كيفية تحقيق الهدف:

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
7
xhudik

كنت أفكر في أن SQL-Server واحد في أعلى وظيفة ستعمل لصالح سايبيس لأنهما كلاهما T-SQL لكن لسوء الحظ لا.

بالنسبة إلى Sybase ، وجدت أن التحديث يجب أن يكون على الطاولة نفسها وليس الاسم المستعار:

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

الخلية

ستحصل على أفضل أداء في حالة نسيان جملة المكان ووضع جميع الشروط في تعبير ON.

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

مثال

سيناريو

لديك جدول المستخدمين. يمكنهم تسجيل الدخول باستخدام اسم المستخدم أو البريد الإلكتروني أو 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;

منطق

إذا كان علينا الانضمام إلى شروط OR فقط ، فستحتاج في الأساس إلى التحقق من كل صف 4 مرات لمعرفة ما إذا كان يجب الانضمام ، وربما ترجع الكثير من الصفوف. ومع ذلك ، فمن خلال منحها مزيدًا من الشروط ، يمكنها "تخطي" الكثير من الصفوف إذا لم تستوف جميع الشروط عند الانضمام.

علاوة

إنه أكثر قابلية للقراءة. جميع الشروط في مكان واحد والصفوف في التحديث في مكان واحد

5
Luke Watts

يتم استخدام العبارة التالية مع FROM الكلمة الأساسية لتحديث صفوف متعددة مع صلة

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

وفي MS Access:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
2
Richard
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
2
Abdullah Yousuf

بالنسبة لـ SQLite ، استخدم خاصية RowID لإجراء التحديث:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');
1
KeithTheBiped

جرب هذا واحد ، وأعتقد أن هذا سوف يصلح لك

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null
1
HARSHIT RATHORE

إن أبسط طريقة هي استخدام Common Table Expression (CTE) المقدمة في SQL 2005

with cte as
(select u.assid col1 ,s.assid col2 from ud u inner join sale s on u.id = s.udid)
update cte set col1=col2
0
Kemal AL GAZZAH