1


0

SQL: mise à jour d’une colonne en fonction des résultats de la sous-requête

J’ai une table T-SQL qui contient les colonnes suivantes: Date, StationCode, HDepth et MaxDepth. Chaque ligne de la colonne MaxDepth est définie sur 0 par défaut. Ce que j’essaie de faire est de trouver la HDepth maximale par date et StationCode, et de mettre à jour la MaxDepth en une colonne sur ces lignes. J’ai écrit une instruction SELECT pour trouver où les maximums se produisent et c’est:

SELECT StationCode, [Date], MAX(HDepth) AS Maximum FROM dbo.[DepthTable] GROUP BY [Date], StationCode

Comment pourrais-je placer cette requête dans une instruction Update pour définir la MaxDepth à 1 sur les lignes qui sont retournées par cette requête?

1 Answer


2


Vous pourriez essayer quelque chose comme ceci:

UPDATE a
SET MaxDepth = 1
FROM dbo.[DepthTable] AS a
    JOIN (
        -- Your original query
        SELECT StationCode, [Date], MAX(HDepth) AS Maximum
        FROM dbo.[DepthTable]
        GROUP BY [Date], StationCode
    ) AS b ON a.StationCode = b.StationCode
        AND a.[DATE] = b.[DATE]
        AND a.HDepth = b.Maximum -- Here we get only the max rows

Cependant, si une colonne est simplement basée sur d’autres colonnes, alors vous pourriez penser à mettre cette logique dans une vue (pour éviter update anomalies). La sélection pour une telle vue pourrait ressembler à:

SELECT a.[Date], a.StationCode, a.HDepth,
    CASE WHEN b.Maximum IS NULL THEN 0 ELSE 1 END AS MaxDepth
FROM dbo.[DepthTable] AS a
    LEFT JOIN (
        -- Your original query
        SELECT StationCode, [Date], MAX(HDepth) AS Maximum
        FROM dbo.[DepthTable]
        GROUP BY [Date], StationCode
    ) AS b ON a.StationCode = b.StationCode
        AND a.[DATE] = b.[DATE]
        AND a.HDepth = b.Maximum -- Here we get only the max rows