एक्सएमएल एक्सएमएल के लिए आउटपुट का चयन करें

एसक्यूएल सर्वर 2005 में चयन करने की कोशिश कर रहा है और आउटपुट को एक्सएमएल में भेज रहा है। तालिका 2 विभिन्न प्रकार की जानकारी के साथ एक सामान्य उपयोग तालिका है। कुछ उत्पाद जानकारी वहां मौजूद है यदि यह टाइप 2 है, तो यह बिक्री का नेतृत्व है यदि यह टाइप 1 है। हम तालिका 1 से प्रत्येक case_num के लिए कई बिक्री लीड और उत्पाद प्राप्त कर सकते हैं।

तालिका 1

case_num, 
date

table 2 (general use)

case_num,
rec_type (1=sales lead; 2=product),
various info based on type in generic columns =
col_a,
col_b,

मैं कुछ ऐसा करने की कोशिश कर रहा हूं:

select 
    case.case_num
    ,case.date
    ,product.col_a as product_name
    ,product.col_b as product_price
    ,lead.col_a as sales_lead_name
    ,lead.col_b as sales_lead_address
from 
    table_1 case
    ,table_2 product
    ,table_2 lead
where 
     (case.case_num = product.case_num AND product.rec_type = 2)
     OR
     (case.case_num = lead.case_num AND lead.rec_type = 1)
for xml auto, elements

यह वापस परिणाम ला रहा है


   1
   1/1/2013
   
      name
      1.00
      
         bob smith
         address 1
      
   
   
      name2
      2.00
      
         bob smith
         address 1
      
   

मैं नहीं चाहता कि नाम हर उत्पाद के लिए दोहराए। कई उत्पादों और एकाधिक लीड के साथ, मैं एसक्यूएल को कैसे प्रारूपित करूं ताकि यह मेरे परिणामों में कार्टेसियन उत्पाद का प्रकार न बन सके?

मैंने अपनी समस्या का वर्णन करने के लिए एक और उदाहरण बनाया। SQL Fiddle उदाहरण यह एक कार्टेशियन परिणाम बना रहा है, सभी भागों से सभी भागों से मेल खाता है। मैं एक केस तो प्रत्येक भाग तो प्रत्येक व्यक्ति, फिर बंद मामले चाहते हैं।

मैं DISTINCT की कोशिश कर रहा था और त्रुटियां प्राप्त कर रहा था। मैंने यूनियन के बारे में दो बार जुड़ने के बारे में सोचा, लेकिन मुझे नहीं लगता कि मैं अपने मामले के लिए एक बड़े चयन के भीतर ऐसा कर सकता हूं।

मुझे क्या मिल रहा है:

CASE_NUM    DATE    PART_NAME   PART_PRICE  PERSON_NAME COMPANY
1   2013-01-01  stapler 1.00    bob smith   acme supplies
1   2013-01-01  matches 2.00    bob smith   acme supplies
1   2013-01-01  stapler 1.00    john doe    john supply inc
1   2013-01-01  matches 2.00    john doe    john supply inc

मैं क्या चाहता हूँ:

CASE_NUM    DATE    PART_NAME   PART_PRICE  PERSON_NAME COMPANY
1   2013-01-01          bob smith   acme supplies
1   2013-01-01          john doe    john supply inc
1   2013-01-01  matches 2.00        
1   2013-01-01  stapler 1.00        
0
खराब आदतों को लात मारना: पुरानी शैली के जॉइन का उपयोग करना - पुरानी शैली तालिकाओं की अल्पविराम से अलग सूची शैली को एएनएसआई- 92 SQL मानक के साथ बंद कर दिया गया था ( 20 वर्ष पहले से अधिक)
जोड़ा लेखक marc_s, स्रोत
मैं केस, लीड 1, लीड 2, लीड 3, प्रोड 1, प्रोड 2, प्रोड 3, क्लोज केस लेना चाहता हूं
जोड़ा लेखक user3023480, स्रोत
लेकिन चूंकि मैं डेटा के दो सेट के लिए एक ही टेबल पर जा रहा हूं और मेरे पास प्रत्येक के गुणक हो सकते हैं, मुझे नहीं पता था कि यह एसक्यूएल के साथ काम करने योग्य था या नहीं
जोड़ा लेखक user3023480, स्रोत
आप किस एक्सएमएल प्रारूप में अपना आउटपुट चाहते हैं ??
जोड़ा लेखक M.Ali, स्रोत
और आपका अपेक्षित आउटपुट क्या है ??
जोड़ा लेखक M.Ali, स्रोत
यह सुंदर मानक एक्सएमएल आउटपुट है ..
जोड़ा लेखक OGHaza, स्रोत

3 उत्तर

एक दोस्त ने केवल एक बार शामिल होने का सुझाव दिया, फिर केस स्टेटमेंट के आधार पर चयन को फ़िल्टर किया और मुझे लगता है कि यह काम करने जा रहा है। धन्यवाद दोस्तों

select case_num = case 
                when child.rec_type = '1' then mast.case_num
                when child.rec_type = '2' then mast.case_num 
              else '' end

     ,mast_date = case 
                when child.rec_type = '1' then mast.date
                when child.rec_type = '2' then mast.date
              else '' end

  ,child.rec_type
  ,part_name = case when child.rec_type = '1' then child.col_a else '' end
  ,part_price = case when child.rec_type = '1' then child.col_b else '' end
  ,subject_name = case when child.rec_type = '2' then child.col_a else '' end
  ,subject_type = case when child.rec_type = '2' then child.col_b else '' end

from table_master mast
join table_child child on mast.case_num = child.case_num
--for xml auto, elements;
0
जोड़ा

चूंकि किसी ने भी इस सवाल का जवाब नहीं दिया है कि मैंने अतीत में कुछ ऐसा किया है, मैं बिल्कुल याद नहीं कर सकता कि मैंने यह कैसे किया है, लेकिन जब तक मुझे डेटा उपलब्ध न हो, तब तक मैं आपको अनुमान लगाने के लिए कुछ मुश्किल कहूंगा, जहां तक ​​मुझे याद है मैंने आपके द्वारा प्रारूपित प्रारूप प्राप्त करने के लिए ऐसा कुछ किया है और यह SQL सर्वर 2005 पर था इसलिए इसे आपके लिए काम करना चाहिए

select case.case_num, case.date,
                    (SELECT col_a   [@productname]
                            ,col_b  [@productprice]

                    FROM table_2 t2
                    WHERE t2.case_num = case.case_num 
                    FOR xml PATH('Details'), TYPE)
from table_1 case 
FOR xml PATH('Case'), ROOT('Cases')

*Please dont down vote the answer as I have explained this is only to put user in some direction, since no one has answered this is only an attempt to help thank you. *

0
जोड़ा

जैसा कि @marc_s बताते हैं, आप अपने कार्टेशियन उत्पाद को अपने तरीके से टेबल में शामिल होने के द्वारा स्वयं बनाते हैं। हमेशा इसके बजाय जॉइन का उपयोग करने का प्रयास करें। मेरा मानना ​​है कि निम्नलिखित क्वेरी आपको फिट करेगी:

select 
    [case].case_num
    ,[case].date
    ,lead.col_a as sales_lead_name
    ,lead.col_b as sales_lead_address
    ,product.col_a as product_name
    ,product.col_b as product_price
from 
    table_1 [case]
JOIN table_2 lead ON [case].case_num = lead.case_num 
  AND lead.rec_type = 1
JOIN table_2 product ON [case].case_num = product.case_num 
  AND product.rec_type = 2
FOR xml auto, elements;

You can view it on SQLFiddle.com

आउटपुट इस तरह दिखेगा:


   1
   2013-01-01
   
      bob smith
      address 1
      
         name
         1.00
      
      
         name2
         2.00
      
   

0
जोड़ा
यह मानता है कि मेरे पास एक लीड और एकाधिक उत्पाद हैं। हकीकत में, मेरे पास कई लीड और एकाधिक उत्पाद हो सकते हैं। इस उदाहरण में, यदि मैं पहले एकाधिक (उत्पादों) का चयन करता हूं, तो यह मुझे देता है:
जोड़ा लेखक user3023480, स्रोत
<मामले> 1 <तिथि> 2013-01-01 <उत्पाद> और जेडडब्ल्यूएनजे; नाम <उत्पादन और जेडडब्ल्यूएनजे; t_price> 1.00 बॉब स्मिथ पता 1 name2 2.0 और zwnj; 0 और zwnj; बॉब स्मिथ पता 1
जोड़ा लेखक user3023480, स्रोत
और लीड को उत्पाद का दोहराया सबसेट बनाता है
जोड़ा लेखक user3023480, स्रोत