Hoe kan ik een UPDATE-statement doen met JOIN in SQL Server?

Ik moet deze tabel in SQL Serverbijwerken met gegevens uit de ‘bovenliggende’ tabel, zie hieronder:

Tabel: verkoop

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

Tabel: ud

id  (int)
assid  (int)

sale.assidbevat de juiste waarde om ud.assidbij te werken.

Welke query doet dit? Ik denk aan een joinmaar ik weet niet zeker of het mogelijk is.


Antwoord 1, autoriteit 100%

Syntaxis hangt strikt af van welke SQL DBMS u gebruikt. Hier zijn enkele manieren om het te doen in ANSI/ISO (ook bekend als zou moeten werken op elke SQL DBMS), MySQL, SQL Server en Oracle. Houd er rekening mee dat mijn voorgestelde ANSI/ISO-methode doorgaans veel langzamer is dan de andere twee methoden, maar als u een andere SQL DBMS gebruikt dan MySQL, SQL Server of Oracle, is dit misschien de enige manier om te gaan (bijv. als uw SQL DBMS MERGEniet ondersteunt):

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
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL-server:

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

PostgreSQL:

update ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

Houd er rekening mee dat de doeltabel niet mag worden herhaald in de FROM-clausule voor Postgres.

Oracle:

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

SQLite:

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
 );

Antwoord 2, autoriteit 6%

Dit zou moeten werken in SQL Server:

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

Antwoord 3, autoriteit 4%

postgres

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 

Antwoord 4, autoriteit 2%

Een standaard SQL-aanpak zou zijn

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

Op SQL Server kun je een join gebruiken

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

Antwoord 5, autoriteit 2%

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;

Antwoord 6

Vereenvoudigde update-query met behulp van JOIN-ing meerdere tabellen.

  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

Opmerking– first_table, second_table, third_table en some_column zoals 123456 zijn demotabelnamen, kolomnamen en id’s. Vervang ze door de geldige namen.


Antwoord 7

Nog een voorbeeld waarom SQL niet echt draagbaar is.

Voor MySQL zou het zijn:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

Lees voor meer informatie de update van meerdere tabellen:
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]

Antwoord 8

Teradata Aster biedt een andere interessante manier om het doel te bereiken:

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

Antwoord 9

Ik dacht dat de SQL-server in de bovenste post zou werken voor Sybase omdat ze allebei T-SQL zijn, maar helaas niet.

Voor Sybase vond ik dat de update op de tafel zelf moet staan, niet de alias:

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

Antwoord 10

De volgende instructie met het FROM-sleutelwoord wordt gebruikt om meerdere rijen bij te werken met een join

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

Antwoord 11

MySQL

Je krijgt de beste prestaties als je de where-clausule vergeet en alle voorwaarden in de ON-expressie plaatst.

Ik denk dat dit komt omdat de query eerst de tabellen moet samenvoegen en vervolgens de waar-clausule daarop uitvoert, dus als je kunt verminderen wat nodig is om deel te nemen, dan is dat de snelste manier om de resultaten te krijgen / de update uit te voeren.

p>

Voorbeeld

Scenario

U heeft een gebruikerstabel. Ze kunnen inloggen met hun gebruikersnaam of e-mail of account_nummer. Deze accounts kunnen actief (1) of inactief (0) zijn. Deze tabel heeft 50000 rijen

Je hebt dan een tafel van gebruikers om in één keer uit te schakelen omdat je erachter komt dat ze allemaal iets slechts hebben gedaan. Deze tabel heeft echter één kolom met gebruikersnamen, e-mails en accountnummers gemengd. Het heeft ook een “HAS_RUN” -indicator die moet worden ingesteld op 1 (true) wanneer deze is uitgevoerd

QUERY

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;

redenering

Als we moesten deelnemen aan alleen de of voorwaarden, zou het in wezen elke nld 4 keer moeten controleren om te zien of het zich zou moeten aansluiten, en mogelijk veel meer rijen retourneren. Door het echter meer omstandigheden te geven, kan het veel rijen “overslaan” als ze niet aan alle voorwaarden voldoen bij het aansluiten.

BONUS

Het is meer leesbaar. Alle voorwaarden zijn op één plaats en de rijen om bij te werken staan ​​op één plaats


Antwoord 12

De eenvoudigste manier is om de gemeenschappelijke tabelexpressie (CTE) geïntroduceerd in 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

Antwoord 13

en in MS Access:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;

Antwoord 14

Probeer deze eens, ik denk dat dit voor jou werkt

update ud
set ud.assid = sale.assid
from ud 
Inner join sale on ud.id = sale.udid
where sale.udid is not null

Antwoord 15

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID

Antwoord 16

Gebruik voor SQLite de eigenschap RowID om de update uit te voeren:

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');

Other episodes