تحديث جداول متعددة في الخلية باستخدام اليسار الانضمام

StackOverflow https://stackoverflow.com/questions/806882

  •  03-07-2019
  •  | 
  •  

سؤال

لدي جدولين و تريد تحديث الحقول في T1 لجميع الصفوف في اليسار الانضمام.

سهلة سبيل المثال ، تحديث جميع الصفوف من النتيجة التالية-مجموعة:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL  

على دليل الخلية تنص على أن:

متعددة-تحديث جدول البيانات يمكن استخدام أي نوع من الانضمام إلى المسموح بها في تحديد البيانات ، مثل اليسار الانضمام.

ولكن أنا لا يمكن العثور على المناسبة بناء الجملة من أجل القيام بذلك في موثقة متعددة الجداول التحديث.

ما هو الصحيح في بناء الجملة?

هل كانت مفيدة؟

المحلول

UPDATE  t1
LEFT JOIN
        t2
ON      t2.id = t1.id
SET     t1.col1 = newvalue
WHERE   t2.id IS NULL

علما أن SELECT سيكون أكثر كفاءة في استخدام NOT IN / NOT EXISTS بناء الجملة:

SELECT  t1.*
FROM    t1
WHERE   t1.id NOT IN
        (
        SELECT  id
        FROM    t2
        )

انظر المقالة في مدونتي الأداء التفاصيل:

لسوء الحظ ، MySQL لا يسمح باستخدام الجدول الهدف في فرعي في UPDATE بيان هذا هو السبب في أنك سوف تحتاج إلى عصا أقل كفاءة LEFT JOIN بناء الجملة.

نصائح أخرى

والشيء نفسه يمكن تطبيقه على سيناريو حيث تم تطبيع البيانات، ولكن الآن تريد جدول لديك القيم الموجودة في جدول ثالث. وفيما يلي يسمح لك لتحديث جدول مع المعلومات من جدول ثالث الذي يحب والجدول الثاني.

UPDATE t1
LEFT JOIN
 t2
ON 
 t2.some_id = t1.some_id
LEFT JOIN
 t3 
ON
 t2.t3_id = t3.id
SET 
 t1.new_column = t3.column;

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

Table A 
+--------+-----------+
| A-num  | text      | 
|    1   |           |
|    2   |           |
|    3   |           |
|    4   |           |
|    5   |           |
+--------+-----------+

Table B
+------+------+--------------+
| B-num|  date        |  A-num | 
|  22  |  01.08.2003  |     2  |
|  23  |  02.08.2003  |     2  | 
|  24  |  03.08.2003  |     1  |
|  25  |  04.08.2003  |     4  |
|  26  |  05.03.2003  |     4  |

وسوف أقوم بتحديث نص الحقل في الجدول ألف مع

UPDATE `Table A`,`Table B`
SET `Table A`.`text`=concat_ws('',`Table A`.`text`,`Table B`.`B-num`," from                                           
",`Table B`.`date`,'/')
WHERE `Table A`.`A-num` = `Table B`.`A-num`

وصلنا إلى هذه النتيجة:

Table A 
+--------+------------------------+
| A-num  | text                   | 
|    1   |  24 from 03 08 2003 /  |
|    2   |  22 from 01 08 2003 /  |       
|    3   |                        |
|    4   |  25 from 04 08 2003 /  |
|    5   |                        |
--------+-------------------------+

وحيث يتم قبول حقل واحد فقط من جدول B، ولكن سآتي إلى هذه النتيجة:

Table A 
+--------+--------------------------------------------+
| A-num  | text                                       | 
|    1   |  24 from 03 08 2003                        |
|    2   |  22 from 01 08 2003 / 23 from 02 08 2003 / |       
|    3   |                                            |
|    4   |  25 from 04 08 2003 / 26 from 05 03 2003 / |
|    5   |                                            |
+--------+--------------------------------------------+
UPDATE `Table A` a
SET a.`text`=(
        SELECT group_concat(b.`B-num`,' from ',b.`date` SEPARATOR ' / ') 
        FROM `Table B` b WHERE (a.`A-num`=b.`A-num`)
)
                DECLARE @cols VARCHAR(max),@colsUpd VARCHAR(max), @query VARCHAR(max),@queryUpd VARCHAR(max), @subQuery VARCHAR(max)
DECLARE @TableNameTest NVARCHAR(150)
SET @TableNameTest = @TableName+ '_Staging';
SELECT  @colsUpd = STUF  ((SELECT DISTINCT '], T1.[' + name,']=T2.['+name+'' FROM sys.columns
                 WHERE object_id = (
                                    SELECT top 1 object_id 
                                      FROM sys.objects
                                     WHERE name = ''+@TableNameTest+''
                                    )
                and name not in ('Action','Record_ID')
                FOR XML PATH('')
            ), 1, 2, ''
        ) + ']'


  Select @queryUpd ='Update T1
SET '+@colsUpd+'
FROM '+@TableName+' T1
INNER JOIN '+@TableNameTest+' T2
ON T1.Record_ID = T2.Record_Id
WHERE T2.[Action] = ''Modify'''
EXEC (@queryUpd)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top