Vraag Hoe kan ik UPDATE vanaf een SELECT in SQL Server?


In SQL Server, het is mogelijk om insert in een tabel met een SELECT uitspraak:

INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'

Is het ook mogelijk om bijwerken via een SELECT? Ik heb een tijdelijke tabel met de waarden en zou graag een andere tabel bijwerken met die waarden. Misschien iets als dit:

UPDATE Table SET col1, col2
SELECT col1, col2 
FROM other_table 
WHERE sql = 'cool'
WHERE Table.id = other_table.id

3032
2018-02-25 14:36


oorsprong


antwoorden:


UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool'

4457
2018-02-25 14:39



Gebruik in SQL Server 2008 (of beter) MERGE

MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

Alternatief:

MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

672
2017-09-09 09:40



UPDATE table 
SET Col1 = i.Col1, 
    Col2 = i.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) i
WHERE 
    i.ID = table.ID

524
2018-01-22 17:47



Ik zou aanpassen Het uitstekende antwoord van Robin Naar het volgende:

UPDATE Table
SET Table.col1 = other_table.col1,
 Table.col2 = other_table.col2
FROM
    Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
    Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
    other_table.col1 IS NOT NULL
    AND Table.col1 IS NULL
)
OR (
    other_table.col2 IS NOT NULL
    AND Table.col2 IS NULL
)

Zonder een WHERE-clausule, zul je zelfs rijen beïnvloeden die niet beïnvloed hoeven te worden, wat (mogelijk) herberekeningen van de index of vuurtriggers zou kunnen veroorzaken die echt niet hadden mogen worden ontslagen.


253
2017-09-08 21:20



Een manier

UPDATE t 
SET t.col1 = o.col1, 
    t.col2 = o.col2
FROM 
    other_table o 
  JOIN 
    t ON t.id = o.id
WHERE 
    o.sql = 'cool'

180
2018-02-25 14:41



Een andere mogelijkheid die nog niet genoemd is, is gewoon de Chuck gooien SELECT zelf een CTE in te voeren en vervolgens de CTE bij te werken.

;WITH CTE
     AS (SELECT T1.Col1,
                T2.Col1 AS _Col1,
                T1.Col2,
                T2.Col2 AS _Col2
         FROM   T1
                JOIN T2
                  ON T1.id = T2.id
         /*Where clause added to exclude rows that are the same in both tables
           Handles NULL values correctly*/
         WHERE EXISTS(SELECT T1.Col1,
                             T1.Col2
                       EXCEPT
                       SELECT T2.Col1,
                              T2.Col2))
UPDATE CTE
SET    Col1 = _Col1,
       Col2 = _Col2

Dit heeft het voordeel dat het gemakkelijk is om het SELECT verklaring als eerste om de resultaten te controleren, maar het vereist wel dat u de kolommen als hierboven vermeldt als ze hetzelfde worden genoemd in de bron- en doeltabellen.

Dit heeft ook dezelfde beperking als het bedrijfseigen UPDATE ... FROM syntaxis weergegeven in vier van de andere antwoorden. Als de brontabel zich aan de vele kanten van een één-op-veel-join bevindt, is het niet vast te stellen welke van de mogelijke overeenkomende gekoppelde records in de Update (een probleem dat MERGE vermijdt door een fout te maken als er een poging is om dezelfde rij meer dan eens te updaten).


140
2017-11-06 00:18



Voor de goede orde (en anderen die zoeken zoals ik was), kun je het op deze manier in MySQL doen:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id

95
2017-10-05 14:20



Alias ​​gebruiken:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id

78
2018-05-23 13:06