2009-04-21 14 views
86

मैंने कोशिश की:SQLite पर तालिकाओं में शामिल होने के दौरान मैं एक अद्यतन कैसे कर सकता हूं?

UPDATE closure JOIN item ON (item_id = id) 
SET checked = 0 
WHERE ancestor_id = 1 

और:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id 

दोनों काम करता है MySQL के साथ, लेकिन उन मुझे SQLite में एक सिंटैक्स त्रुटि दे।

मैं SQL अद्यतन संस्करण 3.5.9 के साथ यह अद्यतन/जॉइन काम कैसे कर सकता हूं?

+0

यह पहले से ही http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same द्वारा उत्तर दिया है -user-name –

उत्तर

122

आप नहीं कर सकते। SQLite doesn't support JOINs in UPDATE statements

लेकिन, आप शायद बजाय एक सबक्वेरी के साथ ऐसा कर सकते हैं:

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1); 

या ऐसा ही कुछ; यह बिल्कुल स्पष्ट नहीं है कि आपकी स्कीमा क्या है।

+20

जहां यह बालों वाली हो जाती है वह तब होती है जब आपको एक एसोसिएशन की दिशा को दूर करने के लिए एक तालिका से दूसरे में एक कॉलम कॉपी करना होता है। जहां MySQL में आप कुछ ऐसा कर सकते हैं, foos.bar_id कॉलम बनाएं, फिर 'foos.bar_id = bar.id' पर foos.bar_id = bars.id' पर बार में शामिल हों अपडेट करें, फिर bar.foo_id कॉलम ड्रॉप करें ... SQLite में यह कैसे किया जा सकता है? अगर कोई जानता है, तो मैं इसका इस्तेमाल कर सकता हूं। – hoff2

+0

@ hoff2 असल में, यह संभवतः ऐसा करने का सबसे आसान तरीका है। मेरे मामले में मुझे EXISTS भाग में भी आवश्यकता नहीं थी: http://stackoverflow.com/a/3845931/847201 –

6

आप REPLACE का भी उपयोग कर सकते हैं तो आप जुड़ने के साथ चयन का उपयोग कर सकते हैं। इस तरह:

REPLACE INTO clusure 
SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change 
FROM (
SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
WHERE ancestor_id = 1) sel 
संबंधित मुद्दे

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