2013-11-25 142 views
2

試圖做一個選擇在SQL Server 2005和輸出發送到XML。表2是具有各種類型信息的通用表。有些產品信息就在那裏,如果是2型,這是一個銷售線索,如果它是類型1.我們可以有多個銷售線索和產品,爲每個case_num從表1SQL選擇輸出到XML

表1

case_num, 
date 

表2(一般情況)

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 

這是帶回結果像

<case> 
    <case_num>1</case_num> 
    <date>1/1/2013</date> 
    <product> 
     <product_name>name</product_name> 
     <product_price>1.00</product_price> 
     <lead> 
     <sales_lead_name>bob smith</sales_lead_name> 
     <sales_lead_address>address 1</sales_lead_address> 
     </lead> 
    </product> 
    <product> 
     <product_name>name2</product_name> 
     <product_price>2.00</product_price> 
     <lead> 
     <sales_lead_name>bob smith</sales_lead_name> 
     <sales_lead_address>address 1</sales_lead_address> 
     </lead> 
    </product> 
</case> 

我不想重複的名字每一個產品。有了多個產品和多個潛在客戶,我該如何格式化SQL,以便在結果中不會生成某種笛卡爾產品?

我做了另一個例子來說明我的問題。 SQL Fiddle example 這使得笛卡爾結果,匹配所有的人所有的部分。我想有一個案件,然後每個部分然後每個人,然後結案。

我試圖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

你想要什麼XML格式的輸出? –

+1

這是非常標準的XML輸出。 – OGHaza

+0

和您的預期輸出是什麼? –

回答

0

朋友建議只參加一次,然後根據病例陳述篩選選擇,我認爲這將起作用。謝謝大家

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 Server的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') 

* 請不要拒絕投票的答案,因爲我已經解釋過這只是爲了讓用戶在某個方向上,因爲沒有人回答這只是一個嘗試去幫助你。 *

0

由於@marc_s指出,可以通過創建笛卡爾乘積自己「加入」表你的方式。請始終嘗試使用JOIN。 我相信下面的查詢會適合你的需要:

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; 

您可以查看它SQLFiddle.com

輸出將是這樣的:

<case> 
    <case_num>1</case_num> 
    <date>2013-01-01</date> 
    <lead> 
     <sales_lead_name>bob smith</sales_lead_name> 
     <sales_lead_address>address 1</sales_lead_address> 
     <product> 
     <product_name>name</product_name> 
     <product_price>1.00</product_price> 
     </product> 
     <product> 
     <product_name>name2</product_name> 
     <product_price>2.00</product_price> 
     </product> 
    </lead> 
</case> 
+0

假設我有一個主角和多個產品。事實上,我可以有多個線索和多個產品。在這個例子中,如果我選擇多個(產品)第一,它給我: – user3023480

+0

2013-01-01 名稱 1.00 Bob Smith的地址1 NAME2 2.00 Bob Smith的地址1 user3023480

+0

並使鉛成爲產品的重複子集 – user3023480