Aide avec la déclaration de mise à jour délicate
-
31-10-2019 - |
Question
J'ai essayé d'écrire cette déclaration de mise à jour toutes les façons possibles à laquelle je peux penser, mais je finis par produire des résultats invalides ou rencontrer une barrière de syntaxe.
J'ai deux variables de table:
DECLARE
@Measurements TABLE(Precidence int, -- the relative scale of a measurement
Measurement varchar(max), -- Grams, Kilograms, Liters, etc
MeasurementType varchar(max)); -- Weight, Volume, etc
Example:
Precidence | Measurement | MeasurementType
2 | G | Weight
1 | KG | Weight
1 | GAL | Volume
2 | L | Volume
3 | ML | Volume
DECLARE
@Items TABLE(ItemType varchar(max),
Quantity float,
Measurement varchar(max),
ToMeasurement varchar(max));
La @Items
Le tableau peut contenir plusieurs mesures pour le même ItemType
. Pour chaque ItemType
J'ai besoin d'identifier la mesure la plus importante, en tenant compte des types de mesure incompatibles et met à jour le ToMeasurement
. Le but ultime est de convertir le Quantity
de chaque ItemType
à la plus grande mesure présente dans le @Items
table donc les éléments de la même chose ItemType
peut être additionné. J'ai déjà écrit la fonction de conversion et l'opération de somme.
Compte tenu de l'entrée du tableau suivant:
ItemType | Quantity | Measurement | ToMeasurement
Widget | 1 | G | NULL
Widget | 1 | KG | NULL
Widget | 1 | ML | NULL
Widget | 1 | L | NULL
Devrait être mis à jour vers:
ItemType | Quantity | Measurement | ToMeasurement
Widget | 1 | G | KG
Widget | 1 | KG | KG
Widget | 1 | ML | L
Widget | 1 | L | L
J'ai réécrit la mise à jour plusieurs fois et à chaque fois que je suis court. À un moment donné, j'avais des sous-questionnaires à quatre niveaux de profondeur. J'avais l'impression de me rapprocher mais ça devenait si complexe que je ne pouvais pas voir la forêt pour les arbres. Ma plus récente tentative est plus simple mais produit encore une fois des résultats incorrects:
UPDATE A
SET A.ToMeasurement = E.Measurement
FROM @Items A
JOIN(SELECT C.ItemType,
D.Measurement
FROM @Measurements B
JOIN @Items C
ON C.Measurement = B.Measurement
JOIN @Measurements D
ON D.MeasurementType = B.MeasurementType)E
ON E.ItemType = A.ItemType;
Je sais que je n'utilise même pas le Precidence
Colonne, qui est l'une des raisons pour lesquelles il ne parvient pas à produire les résultats que je recherche.
Remarques
Voici une requête qui produit le résultat que je recherche (je pense), mais je ne sais toujours pas comment le transformer en une déclaration de mise à jour:
SELECT A.ItemType,
A.Quantity,
A.Measurement,
(SELECT TOP 1 M.Measurement FROM @Measurements M
JOIN @Items C ON C.Measurement = M.Measurement
WHERE M.MeasurementType = B.MeasurementType
AND C.ItemType = A.ItemType
ORDER BY Precidence)ToMeasurement
FROM @Items A
JOIN @Measurements B
ON A.Measurement = B.Measurement;
Pas de solution correcte