Utiliser SELECT à l'intérieur d'une requête de mise à jour

Comment puis-je!--2--> un champ d'une table avec le résultat d'un SELECT interrogation dans Microsoft Access 2007.

Voici la requête Select:

SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS

WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))

GROUP BY FUNCTIONS.Func_ID;

Et voici la requête de mise à jour:

UPDATE FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]
13
demandé sur Juan Mellado 2009-05-16 11:30:18

6 réponses

Eh bien, il semble que L'accès ne peut pas faire des agrégats dans les requêtes de mise à jour. Mais il peut faire des agrégats dans les requêtes SELECT. Créez donc une requête avec une définition comme:

SELECT func_id, min(tax_code) as MinOfTax_Code
FROM Functions
INNER JOIN Tax 
ON (Functions.Func_Year = Tax.Tax_Year) 
AND (Functions.Func_Pure <= Tax.Tax_ToPrice) 
GROUP BY Func_Id

Et l'enregistrer en tant que YourQuery. Nous devons maintenant contourner une autre restriction d'accès. Les requêtes UPDATE ne peuvent pas fonctionner sur les requêtes, mais elles peuvent fonctionner sur plusieurs tables. Alors transformons la requête en une table avec une requête Make Table:

SELECT YourQuery.* 
INTO MinOfTax_Code
FROM YourQuery

il stocke le contenu de la vue dans une table appelée MinOfTax_Code. Maintenant vous pouvez faire une requête de mise à jour:

UPDATE MinOfTax_Code 
INNER JOIN Functions ON MinOfTax_Code.func_id = Functions.Func_ID 
SET Functions.Func_TaxRef = [MinOfTax_Code].[MinOfTax_Code]

faire SQL dans Access est un peu exagéré, je regarderais dans Sql Server Express Edition pour votre projet!

18
répondu Andomar 2009-05-16 10:16:37

j'ai écrit au sujet de certains des limitations des sous-séries corrélées Access/JET SQL pendant un certain temps, et a noté la syntaxe pour rejoindre plusieurs tables pour les Mises à jour SQL. Sur la base de ces informations et de quelques tests rapides, Je ne crois pas qu'il y ait un moyen de faire ce que vous voulez avec Access/JET dans une seule déclaration de mise à jour SQL. Si vous le pouviez, la déclaration se lirait comme suit:

UPDATE FUNCTIONS A
INNER JOIN (
  SELECT AA.Func_ID, Min(BB.Tax_Code) AS MinOfTax_Code
  FROM TAX BB, FUNCTIONS AA
  WHERE AA.Func_Pure<=BB.Tax_ToPrice AND AA.Func_Year= BB.Tax_Year
  GROUP BY AA.Func_ID
) B 
ON B.Func_ID = A.Func_ID
SET A.Func_TaxRef = B.MinOfTax_Code

alternativement, L'accès / JET vous permettra parfois de vous en tirer avec la sauvegarde d'un sous-requête en tant que requête séparée, puis en la joignant dans la déclaration de mise à jour d'une manière plus traditionnelle. Ainsi, par exemple, si nous avons enregistré la sous-requête SELECT ci-dessus comme une requête séparée appelée FUNCTIONS_TAX, alors la déclaration de mise à jour serait:

UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code

Toutefois, cela ne fonctionne toujours pas.

je crois que la seule façon de faire ce travail est de déplacer la sélection et l'agrégation de la valeur Tax_Code minimale hors bande. Vous pouvez le faire avec une fonction VBA, ou plus facilement utilisation de la fonction Access DLookup. Enregistrez le groupe par sous-requête ci-dessus dans une requête séparée appelée FUNCTIONS_TAX et réécrivez la déclaration de mise à jour comme:

UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
  "MinOfTax_Code", 
  "FUNCTIONS_TAX", 
  "Func_ID = '" & Func_ID & "'"
)

notez que la fonction DLookup empêche cette requête d'être utilisée hors accès, par exemple via JET OLEDB. En outre, la performance de cette approche peut être assez terrible en fonction du nombre de lignes que vous ciblez, car le sous-jeu est exécuté pour chaque ligne de fonctions (parce que, bien sûr, il n'est plus corrélé, qui est le point entier pour qu'il fonctionne).

Bonne chance!

6
répondu ewbi 2009-05-16 09:59:56

j'ai eu un problème similaire. Je voulais trouver une chaîne dans une colonne et mettre cette valeur dans une autre colonne dans la même table. L'instruction select ci-dessous trouve le texte à l'intérieur des parenthèses.

quand j'ai créé la requête dans Access j'ai sélectionné Tous les champs. Sur la vue SQL pour cette requête, j'ai remplacé le mytable.myfield pour le champ je voulais avoir la valeur de l'intérieur des parcs avec

SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")), 
            Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1) 

j'ai lancé une requête make table. La table de requête a tous les champs avec la substitution ci-dessus et se termine par INTO NameofNewTable FROM mytable

1
répondu Spud_Gasket 2011-07-30 15:26:01

cela fonctionne? Non testé mais devrait faire passer le message.

UPDATE FUNCTIONS
SET Func_TaxRef = 
(
  SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
  FROM TAX, FUNCTIONS F1
  WHERE F1.Func_Pure <= [Tax_ToPrice]
    AND F1.Func_Year=[Tax_Year]
    AND F1.Func_ID = FUNCTIONS.Func_ID
  GROUP BY F1.Func_ID;
)

essentiellement pour chaque ligne dans les fonctions, le sous-jeu détermine le code d'impôt courant minimum et définit les fonctions.Func_TaxRef à cette valeur. Cela suppose que cela fonctionne.Func_ID est une clé primaire ou Unique.

0
répondu beach 2009-05-16 08:07:41

je voulais ajouter une réponse de plus qui utilise une fonction VBA, mais il obtient le travail fait dans une déclaration SQL. Cependant, il peut être lent.

UPDATE FUNCTIONS
SET FUNCTIONS.Func_TaxRef = DLookUp("MinOfTax_Code", "SELECT
FUNCTIONS.Func_ID,Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS
WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))
GROUP BY FUNCTIONS.Func_ID;", "FUNCTIONS.Func_ID=" & Func_ID)
0
répondu Bobort 2013-07-03 22:16:21

je sais que ce sujet est ancien, mais j'ai pensé que je pourrais y ajouter quelque chose.

Je n'ai pas pu faire de mise à jour avec Select query en utilisant SQL dans MS Access 2010. J'ai utilisé la suggestion de Tomalak pour que ça marche. J'ai eu une capture d'écran, mais je suis apparemment trop d'un newb sur ce site pour pouvoir poster.

j'ai été capable de faire cela en utilisant L'outil de conception de requête, mais même si je regardais une requête de mise à jour confirmée avec succès, Access N'a pas été en mesure de me montrer le SQL qui a fait il se passera. Donc, je ne pouvais pas faire ce travail avec le code SQL seul.

j'ai créé et enregistré ma requête select comme une requête séparée. Dans L'outil de conception de requête, j'ai ajouté la table j'essaye de mettre à jour la requête select que j'avais enregistrée (j'ai mis la clé unique dans la requête select afin qu'il y ait un lien entre eux). Comme Tomalak l'avait suggéré, j'ai changé le Type de requête en Update. J'ai ensuite juste dû choisir les champs (et désigner la table) que j'essayais de mettre à jour. Dans les champs" Update To", I tapé dans le nom des champs de la requête select, j'avais apporté.

ce format a été un succès et a mis à jour le tableau original.

0
répondu sbaer 2014-03-17 17:13:19