2010-11-27 25 views
45

SQLITEएसक्लाइट प्रति डेटा एक टेबल से दूसरे

मेरे पास 2 टेबल "स्रोत" और "गंतव्य" हैं जो समान फ़ील्ड हैं। आईडी और देश, हालांकि दोनों में अन्य फ़ील्ड भी हैं जो आम नहीं हैं।

मैं Destination.Country जहां में शामिल होने आईडी

पर है मुझे के जीवन मैं SQLite ऐसा करने के लिए नहीं कर सकते करने के लिए Source.Country मान की प्रतिलिपि की जरूरत है।

SQL सर्वर आदि में यह एक बहुत ही सरल कार्य है।

विचार?

+1

अद्यतन गंतव्य सेट देश = (चुनिंदा देश स्रोत से जहां आईडी = Destination.id) कहां मौजूद है (1 स्रोत से का चयन करें जहां आईडी = Destination.id); –

+0

क्या यह कुछ ऐसा होगा? http://stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update – Tom

उत्तर

100
INSERT INTO Destination SELECT * FROM Source; 

औपचारिक परिभाषा के लिए SQL As Understood By SQLite: INSERT देखें।

+1

जो जीता है; टी काम के रूप में मुझे आईडी फ़ील्ड में शामिल होने की आवश्यकता है और केवल एक फ़ील्ड (देश) अपडेट करें। –

+4

आप अपनी वास्तविक तालिका स्कीमा से मेल खाने के लिए 'SELECT' क्वेरी में अभिव्यक्ति को आसानी से संशोधित कर सकते हैं। – joschi

1

यदि आप इस तरह के डेटा की प्रतिलिपि बना रहे हैं, तो शायद इसका मतलब है कि आपका डाटामोडल पूरी तरह से सामान्य नहीं है, है ना? क्या देशों की एक सूची बनाना और अधिक जॉइन करना संभव है?

जॉइन के बजाय आप वर्चुअल टेबल का भी उपयोग कर सकते हैं ताकि आपको अपने सिस्टम में प्रश्नों को बदलने की आवश्यकता न हो।

+0

हम एक टेबल से दूसरे में अपडेट कर रहे हैं केवल एक डेटा साफ व्यायाम है। मुझे बस देश के फ़ील्ड (वर्तनी में परिवर्तन) को अपडेट करने की आवश्यकता है –

4

आप पहले से ही दोनों तालिकाओं में मौजूद डेटा है और आप कुछ शर्त के आधार पर एक मेज स्तंभ मान अद्यतन करने के लिए तो यह

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id) 
+0

ऐसा करने से तालिका 1 से डेटा मिटा दिया जाएगा यदि तालिका 2 में तालिका 1 की तुलना में कम पंक्तियां हैं। – zelusp

1

मैं इस कुश्ती किया गया है का उपयोग करें चाहते हैं, और मुझे पता है कि कर रहे हैं अन्य विकल्प है, लेकिन मैं इस निष्कर्ष पर सबसे सुरक्षित पद्धति है पर आए हैं:

create table destination_old as select * from destination; 

drop table destination; 

create table destination as select 
d.*, s.country 
from destination_old d left join source s 
on d.id=s.id; 

यह है क्योंकि आप destination की एक प्रति है इससे पहले कि आप बदल सुरक्षित है। मुझे संदेह है कि जुड़ने के साथ अद्यतन विवरण SQLite में शामिल नहीं थे क्योंकि वे शक्तिशाली हैं लेकिन थोड़ा जोखिम भरा है।

ऊपर दिए गए पैटर्न का उपयोग करके आप दो country फ़ील्ड के साथ समाप्त हो जाते हैं। destination_old से country फ़ील्ड source में country फ़ील्ड को शून्य से प्राप्त करने के लिए आप destination_old से पुनर्प्राप्त करना चाहते हैं और शायद coalesce का उपयोग करके उन सभी कॉलम को स्पष्ट रूप से बताकर उनसे बच सकते हैं। उदाहरण के लिए:

create table destination as select 
d.field1, d.field2,...,coalesce(s.country,d.country) country 
from destination_old d left join source s 
on d.id=s.id; 
संबंधित मुद्दे