plusieurs - Comment puis-je faire une instruction UPDATE avec JOIN dans SQL?




update sql (9)

J'ai besoin de mettre à jour cette table dans SQL Server 2005 avec les données de sa table 'parent', voir ci-dessous:

vente

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

ud

id  (int)
assid  (int)

sale.assid contient la valeur correcte pour mettre à jour ud.assid .

Quelle requête va faire cela? Je pense à une join mais je ne suis pas sûr que ce soit possible.


MySQL

Vous obtiendrez les meilleures performances si vous oubliez la clause where et placez toutes les conditions dans l'expression ON.

Je pense que c'est parce que la requête doit d'abord rejoindre les tables, puis exécute la clause where sur celle-ci, donc si vous pouvez réduire ce qui est requis pour rejoindre, alors c'est la façon rapide d'obtenir les résultats.

Exemple

Scénario

Vous avez une table d'utilisateurs. Ils peuvent se connecter en utilisant leur nom d'utilisateur ou email ou numéro de compte. Ces comptes peuvent être actifs (1) ou inactifs (0). Cette table a 50000 lignes

Vous avez ensuite une table d'utilisateurs à désactiver en une seule fois car vous découvrez qu'ils ont tous fait quelque chose de mal. Cette table a toutefois une colonne avec les noms d'utilisateur, les e-mails et les numéros de compte mélangés. Il a aussi un indicateur "has_run" qui doit être mis à 1 (vrai) quand il a été exécuté

Question

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;

Raisonnement

Si nous devions rejoindre uniquement les conditions OR, il faudrait essentiellement vérifier chaque ligne 4 fois pour voir si elle devrait se joindre, et potentiellement renvoyer beaucoup plus de lignes. Cependant, en lui donnant plus de conditions, il peut "ignorer" beaucoup de lignes si elles ne remplissent pas toutes les conditions lors de l'adhésion.

Prime

C'est plus lisible. Toutes les conditions sont au même endroit et les lignes à mettre à jour sont au même endroit


Cela devrait fonctionner dans SQL Server:

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

Je pensais que le SQL-Server dans le top post fonctionnerait pour Sybase car ils sont tous les deux T-SQL mais malheureusement pas.

Pour Sybase, j'ai trouvé que la mise à jour devait être sur la table elle-même, pas l'alias:

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

L'instruction suivante avec le mot clé FROM est utilisée pour mettre à jour plusieurs lignes avec une jointure

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

Requête de mise à jour simplifiée utilisant JOIN -ing plusieurs tables.

   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

Remarque - first_table, second_table, third_table et some_column comme 123456 sont des noms de tables de démo, des noms de colonnes et des identifiants. Remplacez-les par les noms valides.


Teradata Aster offre un autre moyen intéressant d'atteindre l'objectif:

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

Une approche SQL standard serait

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

Sur SQL Server, vous pouvez utiliser une jointure

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

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 

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




sql-update