2009-11-24 20 views
10

SQL सर्वर प्रश्न। जबस्वचालित रूप से INSERT में कॉलम से मिलान करें ... चुनें ...

INSERT INTO T1 SELECT (C1, C2) FROM T2 

कर रहा है क्योंकि वे T2

में जैसे ही हैं कि ऐसा करना संभव है T1 के स्तंभ नाम निर्दिष्ट करने के लिए नहीं करना चाहते?

वर्तमान में मैं त्रुटि

संदेश 213, स्तर 16, राज्य 1, पंक्ति 1

स्तंभ का नाम या आपूर्ति किए गए मान की संख्या तालिका परिभाषा से मेल नहीं खाता हो रही है।

उत्तर

2

यदि T1 और T2 मिलान बिल्कुल आपके पास दो विकल्प हैं। insert into T1 के लिए आप से सभी कॉलम select कर सकते हैं या आप insert कथन पर कॉलम सूची प्रदान कर सकते हैं।

भले ही आप select MSSQL करते हैं, कॉलम हेडर प्रदान करता है कि कॉलम से मेल खाने के लिए insert कथन द्वारा जानकारी का उपयोग नहीं किया जाता है।

1

क्यों नहीं बस

INSERT INTO t1 
SELECT * FROM T2 
+5

मैं एक स्तंभ (एक जो पहचान प्राथमिक कुंजी है) –

12

हाँ, आप तालिका है कि आप करने के लिए सम्मिलित करने के लिए फ़ील्ड नाम को छोड़ सकते हैं, और आप का चयन का उपयोग कर सकते * मेज से सभी क्षेत्रों पाने के लिए है, लेकिन मैं नहीं होगा इस दृष्टिकोण की सिफारिश करें।

यदि आप फ़ील्ड नाम को छोड़ देते हैं तो फ़ील्ड स्थिति से मेल खाते हैं, नाम से नहीं। यदि फ़ील्ड एक ही क्रम में नहीं हैं, तो वे मिश्रित हो जाएंगे। आम तौर पर आपको टेबल के सटीक लेआउट पर भरोसा करना चाहिए, टेबल में बदलावों को कम करने के लिए प्रश्नों को तोड़ना है।

+1

वहाँ सभी कॉलम नामों में निर्दिष्ट किए बिना 'पहचान key' को छोड़कर सभी स्तंभों को सम्मिलित करने का कोई तरीका है को छोड़ करने की आवश्यकता है?जिन टेबल्स में मैं काम करता हूं उनमें दर्जनों कॉलम होते हैं और उन्हें हर बार सूचीबद्ध करना वाकई उबाऊ होता है। –

+0

हो सकता है कि आप अपने इच्छित सभी कॉलम के साथ एक दृश्य बना सकें और * से चुनें। – cindi

+1

@ कॉन्स्टेंटिन: नहीं, पहचान फ़ील्ड को छोड़कर सभी फ़ील्ड निर्दिष्ट करने का कोई आसान तरीका नहीं है। यह सब कुछ या कुछ भी नहीं है। – Guffa

12

हमेशा INSERT और चयन प्रक्षेपण में स्पष्ट कॉलम का उपयोग करें। यहां तक ​​कि अगर आप नहीं करना चाहते हैं, आपको:

INSERT INTO T1 (C1, c2) 
SELECT C1, C2 FROM T2 
+3

यह कोड डुप्लिकेशंस है जिसे मैं कन्वेंशन-संचालित दृष्टिकोण के पक्ष में छुटकारा पाना चाहता हूं (उसी नाम वाले कॉलम को सिर्फ एक दूसरे के लिए मानचित्र करना चाहिए) –

+2

कोड डुप्लिकेशन अच्छा अभ्यास नहीं होना चाहिए। –

+2

एसक्यूएल आमतौर पर एक वर्बोज़ भाषा है। उदाहरण के लिए खंड द्वारा समूह समेकन में अनावश्यक है, आईएनटीओ अनावश्यक है। मुझे लगता है कि आपको बस इसे स्वीकार करना है। – cindi

0

आप स्तंभ नाम आप उन्हें हमेशा उर्फ ​​कर सकते हैं बारे में चिंतित हैं:

INSERT INTO T1 (C1, c2) 
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2 

या, अधिक संक्षेप:

INSERT INTO T1 (C1, c2) 
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2 

हालांकि मैं वास्तव में नहीं सोच सकता कि क्यों कोई इस तरह के एक साधारण उदाहरण में

+0

क्या कई स्तंभों के लिए उपनाम होना संभव है? उदाहरण के लिए, T1 से ALL_COLUMNS_ALIAS के रूप में T1 ALL_COLUMNS_ALIAS चयन (सी 1, सी 2, सी 3) में डालें? –

-1

इसे संदर्भित किया गया है:

INSERT INTO NEWTABLENAME COL1[,COL2,..COLN] 
SELECT COL1[,COL2,..COLN] FROM THE EXISTINGTABLENAME 
0

पहले इस एसक्यूएल का चयन करें, एसक्यूएल परिणाम से अपनी टेबल लाइन चुनें और लक्ष्य या स्रोत टैबलेट नाम बदलें। यदि तालिकाओं में समान कॉलम हैं (एक ही आदेश आवश्यक नहीं है) यह काम करेगा।

 
with xparams as (  select (select user from dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" from dual ) 
    ,t1 as ( SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER) 
    ,t1c1 as ( SELECT utcs.table_name , LISTAGG(utcs.column_name,',') within group (order by utcs.column_name) "COLS" from USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name) 
    ,res1 as (SELECT 'insert into '|| t1c1.table_name || ' ('|| t1c1.COLS ||') select '|| t1c1.COLS || ' from ' || t1c1.table_name||xparams.ADDSTRTOFROMTABLENAME ||';' "RES" from t1c1, xparams order by t1c1.table_name) 
select * from res1 
संबंधित मुद्दे