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

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top