2009-05-16 15 views
13

मैं कैसे माइक्रोसॉफ्ट एक्सेस में एक SELECT क्वेरी के परिणाम के साथ एक मेज के एक क्षेत्र UPDATE कर सकते हैं 2007उपयोग का चयन एक अद्यतन क्वेरी के अंदर

यहाँ का चयन क्वेरी है:

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; 

यहाँ और है अद्यतन प्रश्न:

UPDATE FUNCTIONS 

SET FUNCTIONS.Func_TaxRef = [Result of Select query] 
+0

आमतौर पर आप एक्सेस क्वेरी डिज़ाइनर में किसी बटन के क्लिक के साथ एक UPDATE क्वेरी में एक SELECT क्वेरी को चालू कर सकते हैं - जब आप SQL व्यू में नहीं हैं, तो कमांड बार में "क्वेरी टाइप" बटन होता है। इसे आज़माएं, यह किसी भी वाक्यविन्यास आवश्यकताओं का ख्याल रखता है। – Tomalak

+0

आपकी टिप्पणी एक मजाक की तरह लगता है। – mammadalius

+4

क्या आप इसके पीछे एक स्माइली देखते हैं? मैं मजाक टिप्पणियों को लिखने की आदत में नहीं हूं जो कई लाइनों का विस्तार करता है। – Tomalak

उत्तर

17

ठीक है, ऐसा लगता है कि एक्सेस अद्यतन क्वेरी में योग नहीं कर सकता है। लेकिन यह SELECT प्रश्नों में समेकित कर सकता है। तो एक परिभाषा के साथ एक क्वेरी बनाएं:

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 

और इसे अपनेQuery के रूप में सहेजें। अब हमें एक और एक्सेस प्रतिबंध के आसपास काम करना है। अद्यतन प्रश्न क्वेरी पर काम नहीं कर सकते हैं, लेकिन वे कई तालिकाओं पर काम कर सकते हैं। तो चलो एक मेक टेबल क्वेरी के साथ एक मेज में क्वेरी गौर करें:

SELECT YourQuery.* 
INTO MinOfTax_Code 
FROM YourQuery 

यह एक मेज MinOfTax_Code कहा जाता है में देखने की सामग्री संग्रहीत करता है।अब आप एक अद्यतन क्वेरी कर सकते हैं:

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

Access में एसक्यूएल कर एक खंड का एक सा है, मैं अपनी परियोजना के लिए Sql सर्वर एक्सप्रेस संस्करण में देखना होता है!

0

क्या यह काम करता है? अनचाहे लेकिन बिंदु को पूरा करना चाहिए।

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; 
) 

मूल रूप से कार्य में प्रत्येक पंक्ति के लिए, सबक्वेरी न्यूनतम मौजूदा कर कोड को निर्धारित करता है और कहा कि मूल्य के लिए FUNCTIONS.Func_TaxRef सेट। यह माना जा रहा है कि FUNCTIONS.Func_ID एक प्राथमिक या अनन्य कुंजी है।

+0

एक्सेस कहता है एल: "संचालन को अद्यतन करने योग्य क्वेरी का उपयोग करना चाहिए।" – mammadalius

+0

@mammadalius जोड़ा गया 2. देखें कि इससे कोई फर्क पड़ता है या नहीं। – beach

+0

एक्सेस कहता है: "सिंटेक्स त्रुटि" – mammadalius

6

मैंने कुछ समय पहले एक्सेस/जेईटी एसक्यूएल में limitations of correlated subqueries के बारे में लिखा था, और SQL अद्यतनों के लिए एकाधिक तालिकाओं में शामिल होने के लिए वाक्यविन्यास पर ध्यान दिया। कि जानकारी और कुछ त्वरित परीक्षण के आधार पर, मैं वहाँ क्या आप एक ही एसक्यूएल अद्यतन बयान में प्रवेश/जेट के साथ चाहते हैं करने के लिए कोई रास्ता नहीं है विश्वास नहीं है। आप, बयान कुछ इस तरह पढ़ा जाएगा सकता है:

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 

वैकल्पिक रूप से, प्रवेश/जेट कभी कभी तो आपको एक अलग प्रश्न के रूप में एक सबक्वेरी बचत और फिर एक और अधिक परंपरागत में अद्यतन बयान में यह शामिल होने के साथ दूर होने देंगे मार्ग। तो, उदाहरण के लिए, अगर हम ऊपर का चयन करें सबक्वेरी बचाया FUNCTIONS_TAX नाम के एक अलग प्रश्न के रूप में, तो अद्यतन बयान होगा:

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

बहरहाल, यह अभी भी काम नहीं करता है।

मेरा मानना ​​है कि आप यह काम करने का एकमात्र तरीका न्यूनतम टैक्स_Cओड मूल्य आउट-ऑफ-बैंड के चयन और एकत्रीकरण को स्थानांतरित करना है। आप इसे एक वीबीए फ़ंक्शन के साथ कर सकते हैं, या एक्सेस DLookup फ़ंक्शन का उपयोग करके अधिक आसानी से कर सकते हैं। एक अलग क्वेरी नामित FUNCTIONS_TAX के लिए ऊपर सबक्वेरी द्वारा समूह को सहेजें और अद्यतन बयान को फिर से लिखने:

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

ध्यान दें कि DLookup फ़ंक्शन जेट OLEDB के माध्यम से उदाहरण के लिए पहुँच के बाहर किया जा रहा है, से इस क्वेरी से बचाता है। इसके अलावा, इस दृष्टिकोण का प्रदर्शन के आधार पर बहुत भयानक हो सकता है कि कितने पंक्तियों आप को लक्षित कर रहे के रूप में सबक्वेरी प्रत्येक कार्य पंक्ति (क्योंकि, ज़ाहिर है, यह अब जोड़ा जाता है, जो क्रम में पूरे मुद्दे है के लिए मार डाला जा रहा है इसके लिए काम करने के लिए)।

गुड लक!

+1

+1 नाइस, DLookup(), यहां तक ​​कि कठिन भी बड़ी टेबल के लिए धीमा हो जाएगा। ऐसा लगता है कि एक्सेस UPDATE किसी क्वेरी पर शामिल होने की अनुमति नहीं देता है, लेकिन यह किसी तालिका में शामिल होने की अनुमति देता है (मेरी पोस्ट देखें।) एक्सेस = अजीब – Andomar

+1

@ewbi: आपको इस KB आलेख में रुचि हो सकती है, टोटल पर आधारित क्वेरी अपडेट करें क्वेरी विफलता (http://support.microsoft.com/kb/116142)। – onedaywhen

+0

एक्सेस में [डोमेन कुल कार्य] भी हैं (https://msdn.microsoft.com/en-us/library/office/aa212172 (v = office.11) .aspx) जैसे 'DAvg',' DMin', 'DMax ',' DCount' और अधिक जो इस तरह की स्थिति में सहायक हो सकते हैं। –

1

मुझे एक ही समस्या थी। मैं एक कॉलम में एक स्ट्रिंग ढूंढना चाहता था और उसी मान में उस मान को दूसरे कॉलम में डाल देना चाहता था। नीचे दिए गए चयन विवरण में माता-पिता के अंदर पाठ मिलता है।

जब मैंने एक्सेस में क्वेरी बनाई तो मैंने सभी फ़ील्ड का चयन किया। उस क्वेरी के लिए एसक्यूएल दृश्य पर, मैं mytable.myfield क्षेत्र के लिए मैं

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

मैं एक मेकअप तालिका क्वेरी भाग गया साथ कोष्ठक के अंदर से मान होना चाहता था बदल दिया। मेक टेबल क्वेरी में उपरोक्त प्रतिस्थापन वाले सभी फ़ील्ड हैं और INTO NameofNewTable FROM mytable

0

मैं एक और उत्तर जोड़ना चाहता हूं जो वीबीए फ़ंक्शन का उपयोग करता है, लेकिन यह एक SQL कथन में काम करता है। हालांकि, यह धीमा हो सकता है।

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

मुझे पता है कि यह विषय पुराना है, लेकिन मैंने सोचा कि मैं इसमें कुछ जोड़ सकता हूं।

मैं एमएस एक्सेस 2010 में एसक्यूएल का उपयोग कर चयन क्वेरी के साथ अद्यतन नहीं कर सका। मैंने इस काम को करने के लिए तोमालक के सुझाव का उपयोग किया। मेरे पास एक स्क्रीनशॉट था, लेकिन जाहिर है कि इस साइट पर इसे पोस्ट करने में सक्षम होने के लिए बहुत अधिक नया है।

मैं क्वेरी डिजाइन टूल का उपयोग करके ऐसा करने में सक्षम था, लेकिन यहां तक ​​कि जब मैं एक सफल सफल क्वेरी क्वेरी देख रहा था, तो एक्सेस मुझे ऐसा होने वाला एसक्यूएल दिखाने में सक्षम नहीं था। तो मैं अकेले एसक्यूएल कोड के साथ यह काम नहीं कर सका।

मैंने अपनी चुनी क्वेरी को एक अलग क्वेरी के रूप में बनाया और सहेजा। क्वेरी डिज़ाइन टूल में, मैंने उस तालिका को जोड़ा जो मैं सहेजने वाली चुनिंदा क्वेरी को अपडेट करने का प्रयास कर रहा हूं (मैंने अनन्य कुंजी को चुनिंदा क्वेरी में रखा है, इसलिए इसमें उनके बीच एक लिंक था)। जैसे ही टॉमलाक ने सुझाव दिया था, मैंने क्वेरी टाइप को अपडेट में बदल दिया। तब मुझे खेतों को चुनना पड़ा (और तालिका को नामित करना) मैं अद्यतन करने की कोशिश कर रहा था। "अपडेट टू" फ़ील्ड्स में, मैंने चयनित क्वेरी से फ़ील्ड के नाम पर टाइप किया था।

यह प्रारूप मूल तालिका को सफल और अपडेट किया गया था।

संबंधित मुद्दे