2009-02-11 2 views
15

मैं एक का चयन क्वेरी जो अनिवार्य रूप से एक क्षेत्र को पुन: फ़ॉर्मेट के लिए कुछ पाठ हेरफेर करता है का उपयोग करना चाहिए अगर मेरे पास "जे 1/2" जैसा फ़ील्ड है तो यह उचित फ़ील्ड में जे 1 और जे 2 के साथ एक अलग तालिका में रिकॉर्ड की आईडी देखता है।एमएस एक्सेस में एसक्यूएल अद्यतन संकट ऑपरेशन इतना है कि मैं इसे एक और तालिका में देख सकते हैं एक से अपडेट किए जाने क्वेरी

यह सब ठीक काम करता है।

अब मैं मूल तालिका को अपडेट करना चाहते तो मैं अब और इस स्ट्रिंग परिवर्तन का उपयोग कर लुकअप करने की जरूरत नहीं है, लेकिन अद्यतन प्रश्नों पर अपने प्रयासों के "ऑपरेशन एक से अपडेट किए जाने क्वेरी का उपयोग करना चाहिए"

कोई भी विचार के साथ समाप्त?

मेरे SELECT कथन:

SELECT DISTINCT 
t1.DD, 
t1.TN, 
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart, 
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd, 
t2.ID 
FROM t1 INNER JOIN t2 
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink) 
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink) 
WHERE t1.TN Like "J?/?" 
AND t1.DD Like "M*"; 

याद - यह ठीक काम करता है और मैं दूसरे छोर बाहर आवश्यक t2.ID मिलता है।

UPDATE t1 SET t2ID = (
    SELECT Query1.ID 
    FROM Query1 
    WHERE t1.DD=Query1.DD 
    AND t1.TN=Query1.TN 
    ) 
WHERE t1.TN Like "J?/?" 
AND t1.DD Like "M*"; 

केवल इस विफल रहता है:

इसलिए मैं कुछ ऐसा करना चाहते हैं। यह एमएस एक्सेस के भीतर ही है, इसलिए मैं वास्तविक अनुमतियों की समस्या की कल्पना नहीं कर सकता क्योंकि अधिकांश "ऑपरेशन को अद्यतन करने योग्य क्वेरी का उपयोग करना चाहिए" समस्याएं प्रतीत होती हैं।

संपादित करें: काम करने वाले मामले को सरल बनाने की कोशिश कर रहा है।

इस अद्यतन क्वेरी ठीक है:

UPDATE t1 
SET t2ID="Unknown" 
WHERE TN LIKE "J?/?" 
AND DD LIKE "M*"; 

यह एक विफल रहता है (धन्यवाद Goedke - इस उदाहरण स्पष्ट रूप से विफल रहता है क्योंकि सबक्वेरी 1 से अधिक परिणाम देता है मैं मेरी समस्या खोजने की कोशिश करने के लिए oversimplified था।)

UPDATE t1 
SET t2ID=(SELECT ID FROM t2) 
WHERE TN LIKE "J?/?" 
AND DD LIKE "M*"; 

तो क्या मेरे पास बस मेरे सबक्वायरी वाक्यविन्यास को किसी तरह से गलत है?

संपादित करें: यह SELECT कथन भी ठीक है:

SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS, 
    query1.DD, query1.TN, query1.ID 
FROM t1 INNER JOIN query1 
ON t1.DD=query1.DD 
AND t1.TN=query1.TN 

इसके अलावा, चुनिंदा बयान पर गिनती का उपयोग करके उपरोक्त से पता चलता है कि वहाँ वास्तव में 1 आईडी प्रति (डीडी, TN) संयोजन

संपादित लौटाए जाने :

अब मुझे सबसे आसान मामला मिल गया है - विभिन्न चयन कथनों का उपयोग करके अब मेरे पास केवल 2 कॉलम के साथ एक तालिका है - टी 1 की प्राथमिक कुंजी और वह मान जिसे मैं टी 1 में सम्मिलित करना चाहता हूं।

मैं अभी भी

UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1) 

लिखने के लिए जहां t1 के प्राथमिक कुंजी f1 है नहीं कर पा रहे। यहां तक ​​कि जहां भी t1.f1 जोड़ते हैं (टी 2 से F1 चुनें) मदद नहीं करता है। (संभावना है कि सबक्वायरी 0 परिणाम देता है)

+0

अपने प्रश्न का संपादित करें के बारे में क्षमा करें: मैं गलत संपादित करें बटन हिट:/ – Godeke

+2

Btw, मैं अत्यधिक अपनी पीठ अंत के रूप में एसक्यूएल एक्सप्रेस की सिफारिश करेंगे। कारण मुझे इस समस्या का सामना नहीं करना है कि मैं हमेशा बैक एंड पर एक एसक्यूएल इंजन का उपयोग करता हूं, इससे कोई फर्क नहीं पड़ता कि परियोजना कितनी छोटी है ... एसक्यूएल एक्सेस इस मामले में स्पष्ट रूप से टूटा हुआ है। – Godeke

+1

जेट एसक्यूएल बिल्कुल टूटा नहीं है। जेट एसक्यूएल में मानक SQL92 की तुलना में क्वेरी को अद्यतन करने योग्य बनाने के लिए अधिक विकल्प हैं। मेरा सुझाव है कि जेट-विनिर्देश DISTINCTROW भविष्यवाणी करने का प्रयास करें। यह अक्सर एक गैर-अद्यतन करने योग्य क्वेरी को अद्यतन करने के लिए मजबूर कर सकता है। –

उत्तर

6

(टी 2 से चयन आईडी) का एक उप-कार्य तब तक काम नहीं कर सकता जब तक कि टी 2 में केवल एक रिकॉर्ड न हो। आप किस आईडी का उपयोग करने की उम्मीद कर रहे हैं?

त्रुटि संदेश जो सामान्य रूप से रिपोर्ट किया जा रहा है तब होता है जब आप जुड़ते हैं और डेटा बाध्य रूप में तालिकाओं पर वापस अद्यतन करने के लिए आवश्यक सभी प्राथमिक कुंजी शामिल नहीं होते हैं (उदाहरण के लिए, आपका मूल DISTINCT कुंजी के बारे में जानकारी को नष्ट कर देता है, इसलिए अगर यह किसी रूप से बंधे थे, तो फॉर्म वापस सहेजने में सक्षम नहीं होगा)।

तथ्य यह है कि आप DISTINCT का उपयोग कर रहे हैं, मुझे संदेह होगा कि उप क्वेरी आपके जटिल उदाहरण में एक से अधिक पंक्तियों को वापस कर रही है। उप-परिणाम परिणाम से बाहर निकलने के साथ यह शायद सबसे आम समस्या है: जहां खंड को कम करना है।

एक अन्य समस्या जो मैंने सबक्वायरी से बाहर करने के साथ देखा है, यदि आंतरिक क्वेरी के वाक्यविन्यास गलत है। कम से कम SQL 2000 और 2005 के साथ समाप्त होने पर, क्वेरी प्रोसेसर चुपचाप विफल हो जाएगा और ऐसे मामलों में शून्य वापस लौटाएगा। (यह है, जहां तक ​​मैं कह सकता हूं, एक बग: मुझे कोई कारण नहीं दिखता है कि शीर्ष स्तर पर कोई त्रुटि वापस करने के लिए कुछ सबकुछ में चुपचाप अनुमति दी जाएगी ... लेकिन वहां यह है।)

संपादित करें : बस सुनिश्चित करने के लिए है कि न तो पॉल या मैं पागल नहीं जा रहा था, मेरे द्वारा बनाए गए निम्न तालिकाओं:

t1 | ID, FK, Data 
t2 | ID2, Data2 

मैं नहीं आईडी और आईडी 2 पर एक प्राथमिक कुंजी को छोड़कर किसी भी बाधाओं डाल किया था। सभी फ़ील्ड टेक्स्ट थे, जो कि मैं आम तौर पर आईडी के लिए उपयोग करता हूं, लेकिन यह अप्रासंगिक होना चाहिए।

t1:

ID FK Data 
Key1  Data1 
Key2  Data2 
Key3  Data3 

t2:

ID2 Data2 
Key1 DataA 
Key2 DataB 
Key3 DataC 

प्रपत्र की एक क्वेरी:

UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID); 

एक ही संदेश पॉल मिला साथ में विफल।

select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1, 

अपेक्षित काम करता है, इसलिए हम जानते हैं कि सबक्वायरी वाक्यविन्यास दोष नहीं है।

UPDATE t1 SET t1.FK = 'Key1' 

भी अपेक्षित काम करता है, इसलिए हमारे पास भ्रष्ट या गैर अद्यतन करने योग्य गंतव्य नहीं है।

नोट: यदि मैं डेटाबेस बैकएंड को देशी से SQL 2005 में बदलता हूं, तो अद्यतन काम करता है! आसपास googling के एक बिट, और मुझे लगता है पहुँच MVPs सुझाव DLookup एक सबक्वेरी को बदलने के लिए:

http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx

जाहिर है इस प्रवेश एसक्यूएल, एक में एक बग है कि जब किसी SQL एक्सप्रेस 2000 या वापस उच्च अंत का उपयोग कर से बचा जाता है । ("एक्सेस अपडेट सबक्वायरी" के लिए Google परिणाम इस सिद्धांत का समर्थन करते हैं)। http://www.techonthenet.com/access/functions/domain/dlookup.php

+0

अच्छा बिंदु - मैं oversimplified ... –

+0

क्या आप सुनिश्चित हैं कि आपके कम सरलीकृत प्रश्न एकल परिणाम लौट रहे हैं? – Godeke

+0

मैं बस इसे देख रहा हूं - यह कहकर कि मूल क्वेरी एक परिणाम लौट रही है। –

0

इस एक के लिए:: अद्यतन t1 सेट t1.f2 = (t2 कहां t2.f1 = t1 से t2.f2 चयन

कैसे इस समाधान का उपयोग करने के लिए के लिए यहां देखें।f1)

UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2]; 
+0

नहीं, अभी भी "ऑपरेशन को एक अद्यतन करने योग्य क्वेरी का उपयोग करना चाहिए" –

+0

FWIW मैंने "टी 2" की प्रतिलिपि बनाकर इस पर काम किया जो वास्तव में एक प्रश्न था, एक अस्थायी तालिका में, अस्थायी तालिका को एफ 1 (शामिल कॉलम) पर प्राथमिक कुंजी देकर –

6

मैं पूरी धागा पढ़ havent't, लेकिन यह समाधान है कि मैं का उपयोग कर रहा है:

update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2 

और यह मेरे लिए एमएस एक्सेस में ठीक काम करता है।

17

मुझे ओपी पर डेविड डब्ल्यू फेंटन की टिप्पणी के साथ वजन करना है।

जेट/एसीई के साथ यह बहुत परेशान करने वाली समस्या है। लेकिन या तो कोशिश:

  1. क्वेरी गुण के लिए जाना ( फलक जहां तालिकाओं में दिखाए जाते की पृष्ठभूमि पर क्लिक करें) और सेट 'अनोखा रिकार्ड' के लिए 'हां'
  2. विकल्प 1 के बराबर है कुछ हद तक अजीब लग रही SELECT खंड के DISTINCTROW कीवर्ड जोड़ने, जैसे

:

0,123,
UPDATE DISTINCTROW tblClient 
     INNER JOIN qryICMSClientCMFinite 
      ON tblClient.ClientID = qryICMSClientCMFinite.ClientID 
    SET tblClient.ClientCMType = "F"; 

यह इस त्रुटि संदेश से जुड़ी इतनी सारी समस्याओं को हल करता है कि यह लगभग हास्यास्पद है।

संक्षेप में एमएस एक्सेस है - यदि आप समस्या x के लिए व्यापार-गुप्त कार्यवाही नहीं जानते हैं, तो आप उत्तर खोजने का प्रयास कर सकते हैं। 10,000 वर्कअराउंड्स को जानने के लिए प्रोग्राम एक्सेस है। क्या यह अनियमित के लिए पर्याप्त चेतावनी है?

बेन

+0

केवल अनियमित के लिए चेतावनी के लिए +1। वह सोना है। –

+0

मुझे विश्वास है कि जेट 3.x अद्यतन करने योग्यता के लिए अधिक क्षमा कर रहा था, लेकिन ऐसे तरीकों से जो अन्य SQL कार्यान्वयन के साथ समन्वयित नहीं थे। मुझे लगता है कि जेट 4 अपडेटटाइबिलिटी में बदल जाता है (जो हमें अनुभवी एक्सेस डेवलपर्स में से नरक से परेशान करता है) वास्तव में जेट एसक्यूएल को कम अजीब बनाने की दिशा में एक कदम था, भले ही इसमें अभी भी कुछ चीजें हैं जो अन्य एसक्यूएल के साथ व्यवहार नहीं करती हैं बोलियां करते हैं। –

+0

और, बीटीडब्ल्यू: एक्सेस 2 में, SELECT क्वेरी के लिए डिफ़ॉल्ट DISTINCTROW था बस इसके बजाय चुनें। मैं हमेशा बता सकता हूं कि मुझे उस स्थान पर चयन डिस्टिंट्रो के साथ एक ऐप का सामना करना पड़ता है, जिसकी संभावना संभवतः एक्सेस 2 में वापस बनाई गई थी। –

7

यह मेरे लिए काम किया (एक्सेस 2000)

UPDATE DISTINCTROW T1 inner join T2 on T2.f1 = T1.f1 SET f2 = f2; 
+1

यह मेरे लिए भी ठीक काम करता है (एक्सेस 2010)। बहुत बहुत धन्यवाद। –

1

मेरे समाधान है कि रास्ते में मेरी एसक्यूएल बदलने के लिए किया गया था।

update (select o.pricein, g.pricein from operations o left join goods g on g.id = o.goodid where o.opertype = 4 and o.acct = 1) 
    set o.pricein = g.pricein 
+0

आप कह रहे हैं कि एसक्यूएल जेट/एसीई द्वारा निष्पादित किया गया था? मैं आश्चर्यचकित हूं, क्योंकि ऐसा लगता है कि यह अद्यतन के बाद तालिका खो रहा है।और क्या चयन में जॉइन के साथ एक अपडेट काम करता है, इस बात पर निर्भर करता है कि आप किस तालिका में शामिल हो रहे हैं और शामिल फ़ील्ड पर इंडेक्स। –

1

मैं एक ही त्रुटि थी ("ऑपरेशन एक से अपडेट किए जाने क्वेरी का उपयोग करना चाहिए") पहुँच 2010 का उपयोग कर और मैं एक आंतरिक के साथ एक सरल अद्यतन क्वेरी प्रदर्शन कर रहा था में शामिल हो। मैंने जो कुछ भी शामिल किया था उस तालिका में प्राथमिक कुंजी जोड़ दी गई थी (पहले से ही एक टेबल पर, जिसे मैं अद्यतन कर रहा था) और सबकुछ काम करता था।

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