3
votes

Requête SQL Server pour mettre à jour plusieurs lignes avec le même nom

Je joue toujours avec les tables et les requêtes, mais j'ai besoin d'aide avec une requête SQL Server.

J'ai une table qui ressemble à ceci.

UPDATE working_table t1
SET Result = 'Failed'
WHERE disktype = 'OS' AND 
      status = 'Failed' AND
      NOT EXISTS (SELECT 1 FROM working_table t2 WHERE t1.VMname = t2.VMname);

Dans les résultats , j'aimerais qu'il dise "Terminé" si le système d'exploitation et les disques de données ont l'état terminé.

Si toutefois, le disque du système d'exploitation affiche un échec, alors la colonne de résultats devrait afficher un échec pour tous les disques de cette VM.

Comme ça.

VMName   | DiskType   | Status      | Result
---------+------------+-------------+---------
TestVM1  |  OS        | Completed   | Completed
TestVM1  |  Data      | Completed   | Completed
TestVM2  |  OS        | Failed      | Failed
TestVM2  |  Data      | Completed   | Failed
TestVM2  |  Data      | Completed   | Failed

J'ai essayé de bricoler une requête, mais je ne sais pas quoi Je me trompe car il ne fait rien.

VMName   | DiskType   | Status      | Result
---------+------------+-------------+---------
TestVM1  |  OS        | Completed   | 
TestVM1  |  Data      | Completed   | 
TestVM2  |  OS        | Failed      | 
TestVM2  |  Data      | Completed   | 
TestVM2  |  Data      | Completed   | 


1 commentaires

Votre table n'a-t-elle que 2 valeurs de type de disque: OS et Data ? Seulement 2 valeurs de statut: Terminé et Échec ? Que faire si Données est Échec et OS est Terminé ?


3 Réponses :


0
votes

Cette requête peut vous aider.

SELECT *,MAX(status) 
         OVER ( 
           partition BY vmname 
           ORDER BY vmname ) [Results] 
FROM   working_table 

vous pouvez mettre à jour votre tableau à partir de ces résultats


0 commentaires

2
votes

On dirait qu'il n'a besoin que d'un EXISTS

UPDATE t1
SET Result = CASE
             WHEN EXISTS (SELECT 1 FROM working_table t2 WHERE t2.VMname = t1.VMname AND t2.disktype = 'OS' AND t2.[Status] = 'Failed') 
             THEN 'Failed' 
             ELSE t1.[Status] 
             END
FROM working_table t1;

Ou si vous souhaitez mettre à jour tous les résultats, pas seulement ceux qui ont échoué:

UPDATE t1
SET Result = 'Failed'
FROM working_table t1
WHERE EXISTS (
      SELECT 1 
      FROM working_table t2 
      WHERE t2.VMname = t1.VMname
        AND t2.disktype = 'OS' 
        AND t2.[Status]= 'Failed'
);


0 commentaires

1
votes

Veuillez essayer

create table  working_table
(
VMName varchar(30),
DiskType  varchar(64),
[Status] varchar(30),
Result varchar(64)
)

insert into working_table values
('TestVM1','OS','Completed',NULL),
('TestVM1','Data','Completed',NULL),
('TestVM2','OS','Failed',NULL),
('TestVM2','Data','Completed',NULL),
('TestVM2','Data','Completed',NULL)

;WITH CTE AS
(
SELECT 
*,
SUM(CASE [Status] WHEN 'Failed' THEN 1 ELSE 0 END) OVER (partition by VMName) as v_flag  
FROM working_table
)
UPDATE CTE SET Result=CASE WHEN  v_flag >0 THEN 'Failed' ELSE 'Completed' END

--Query
SELECT * FROM working_table

--Output
/*
VMName                         DiskType                                                         Status                         Result
------------------------------ ---------------------------------------------------------------- ------------------------------ ----------------------------------------------------------------
TestVM1                        OS                                                               Completed                      Completed
TestVM1                        Data                                                             Completed                      Completed
TestVM2                        OS                                                               Failed                         Failed
TestVM2                        Data                                                             Completed                      Failed
TestVM2                        Data                                                             Completed                      Failed
*/

Cordialement,

Will


0 commentaires