Frage

Ich habe zwei Tabellen, und will Felder in T1 aktualisieren für alle Zeilen in einem LEFT JOIN.

Für ein einfaches Beispiel, aktualisieren Sie alle Zeilen des folgenden Ergebnis-Satzes:

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

Das MySQL-Handbuch heißt es:

  

Multiple-Tabelle UPDATE-Anweisungen können jede Art der Nutzung von in SELECT-Anweisungen erlaubt join, wie LEFT JOIN.

Aber ich kann nicht die richtige Syntax zu tun, dass in der dokumentierten mehrere Tabellen UPDATE finden.

Was ist die richtige Syntax?

War es hilfreich?

Lösung

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

Beachten Sie, dass für eine SELECT wäre es effizienter zu bedienen NOT IN / NOT EXISTS Syntax:

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

Siehe den Artikel in meinem Blog für Leistungsdetails:

Leider MySQL erlaubt es nicht, die Zieltabelle in einer Unterabfrage in einer UPDATE Anweisung, das ist, warum Sie zu einem weniger effizienter LEFT JOIN Syntax haften müssen.

Andere Tipps

Das gleiche kann auf ein Szenario angewendet werden, wo die Daten normalisiert wurde, aber jetzt wollen Sie eine Tabellenwerte in einer dritten Tabelle gefunden zu haben. Im Folgenden können Sie eine Tabelle aktualisieren, mit Informationen aus einer dritten Tabelle, die durch einen zweiten Tisch gefallen ist.

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;

Dies wäre nützlich in einem Fall, in dem Sie Benutzer und Gruppen hatten, und man wollte, ein Benutzer in der Lage sein, ihre eigene Variante des Gruppennamen hinzufügen, so ursprünglich würden Sie die vorhandenen Gruppennamen in das Feld importieren mögen, wo wird der Benutzer in der Lage sein, ihn zu ändern.

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  |

Ich werde Feld Text in Tabelle A aktualisieren mit

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`

und kommen zu diesem Ergebnis:

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

, wo nur ein Feld aus der Tabelle B akzeptiert wird, aber ich werde zu diesem Ergebnis kommen:

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top