2012-11-27 17 views
5

मेरे पास तालिका ए है, नीचे, जहां प्रत्येक अद्वितीय आईडी के लिए, कुछ मूल्य वाले तीन कोड हैं।मैं डीबी 2 में एक टेबल कैसे लगा सकता हूं?

Id Code1_Val Code2_Val Code3_Val 

यहां प्रत्येक अद्वितीय आईडी के लिए सिर्फ एक पंक्ति है:

ID Code Value 
--------------------- 
11  1  x 
11  2  y 
11  3  z 
12  1  p 
12  2  q 
12  3  r 
13  1  l 
13  2  m 
13  3  n 

मैं नीचे के रूप में प्रारूप के साथ एक दूसरी तालिका बी की है। मैं पहली तालिका से प्रत्येक आईडी के लिए पहली तालिका ए से इस दूसरी तालिका बी को पॉप्युलेट करना चाहता हूं।

Id Code1_Val Code2_Val Code3_Val 
--------------------------------------------- 
11  x   y    z 
12  p   q    r 
13  l   m    n 

कैसे मैं एक ही SQL क्वेरी में इस लक्ष्य को हासिल कर सकते हैं:

ऊपर पहली तालिका एक के लिए, दूसरी तालिका बी के रूप में बाहर आना चाहिए?

उत्तर

2

अपने संस्करण DECODE() नहीं है, तो आप भी इस का उपयोग कर सकते हैं:

INSERT INTO B (id, code1_val, code2_val, code3_val) 
WITH Ids (id) as (SELECT DISTINCT id 
        FROM A) -- Only to construct list of ids 

SELECT Ids.id, a1.value, a2.value, a3.value 
FROM Ids -- or substitute the actual id table 
JOIN A a1 
    ON a1.id = ids.id 
     AND a1.code = 1 
JOIN A a2 
    ON a2.id = ids.id 
     AND a2.code = 2 
JOIN A a3 
    ON a3.id = ids.id 
     AND a3.code = 3 

(मेरे वी 6 आर 1 डीबी 2 उदाहरण पर काम करता है, और SQL Fiddle Example है)।

+0

के बाद "" "है, यदि तालिका ए को नया कोड या दो मिलता है तो यह गतिशील रूप से करने का कोई तरीका है? – John

+0

आसानी से नहीं, और आपको गतिशील एसक्यूएल भी चाहिए। मुझे यकीन है कि यहां कहीं और उदाहरण हैं - अनिवार्य रूप से, आपको 'सिस्टम जानकारी' स्कीमा टेबल को पढ़ना होगा, इस तरह से क्वेरी को इकट्ठा करना होगा, फिर इसे निष्पादित करना होगा। यह देखते हुए कि 'ए' में समग्र सम्मिलन बहुत दुर्लभ होना चाहिए, शायद बयान और क्लाइंट कोड को अपडेट करना आसान होगा ... अन्यथा, आप ईएवी क्षेत्र में जा रहे हैं, जो (कुछ हद तक) संबंधित है लेकिन थोड़ा अलग है । –

+0

[एक बेहतर उत्तर है जो केवल एक बार तालिका तक पहुंचता है] (https://stackoverflow.com/a/23207503/521799) –

0

यहाँ एक SQLFiddle example

insert into B (ID,Code1_Val,Code2_Val,Code3_Val) 
select Id, max(V1),max(V2),max(V3) from 
(
select ID,Value V1,'' V2,'' V3 from A where Code=1 
union all 
select ID,'' V1, Value V2,'' V3 from A where Code=2 
union all 
select ID,'' V1, '' V2,Value V3 from A where Code=3 
) AG 
group by ID 
+0

यह विशेष रूप से डीबी 2 के लिए माना जाता है। SQLFiddle डीबी 2 का समर्थन नहीं करता है ... –

+0

हाँ यकीन है। यह एसक्यूएल कमांड एसक्यूएल-9 2 संगत है इसलिए सभी डीबीएमएस को इसका समर्थन करना है। – valex

+0

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

-1

आप अपने डेटा पिवट करने के लिए चाहते हैं। के बाद से डीबी 2 कोई धुरी कार्य है, यो डिकोड (मूल रूप से एक मामले बयान।) का उपयोग कर सकते

वाक्य रचना होना चाहिए:

SELECT Id, 
    DECODE(Code, 1, Value) AS Code1_Val, 
    DECODE(Code, 2, Value) AS Code2_Val, 
    DECODE(Code, 3, Value) AS Code3_Val, 
FROM A 
+2

डीबी 2 के संस्करण पर निर्भर; मेरा V6R1 (iSeries) संस्करण नहीं है। –

+0

धन्यवाद। आप केस स्टेटमेंट का उपयोग करने के लिए इस कथन को अपडेट कर सकते हैं, और एकाधिक जॉइन से बच सकते हैं। –

+1

आपके पास कोड 3_Val – Esperento57

5
select Id,            
     max(case when Code = '1' then Value end) as Code1_Val, 
     max(case when Code = '2' then Value end) as Code2_Val, 
     max(case when Code = '3' then Value end) as Code3_Val 
     from TABLEA          
     group by Id            
0

यहाँ एसक्यूएल क्वेरी है:

insert into pivot_insert_table(id,code1_val,code2_val, code3_val) 
select * from (select id,code,value from pivot_table) 
pivot(max(value) for code in (1,2,3)) order by id ; 
1
SELECT Id, 
max(DECODE(Code, 1, Value)) AS Code1_Val, 
max(DECODE(Code, 2, Value)) AS Code2_Val, 
max(DECODE(Code, 3, Value)) AS Code3_Val 
FROM A 
group by Id 
0
WITH Ids (id) as 
(
    SELECT DISTINCT id FROM A 
) 
SELECT Ids.id, 
(select sub.value from A sub where Ids.id=sub.id and sub.code=1 fetch first rows only) Code1_Val, 

(select sub.value from A sub where Ids.id=sub.id and sub.code=2 fetch first rows only) Code2_Val, 

(select sub.value from A sub where Ids.id=sub.id and sub.code=3 fetch first rows only) Code3_Val 
FROM Ids 
संबंधित मुद्दे