SQL选择输出到XML

时间:2013-11-25 22:54:42

标签: sql sql-server xml sql-server-2005

尝试在SQL Server 2005中执行select并将输出发送到xml。表2是具有各种类型信息的一般使用表。如果它是类型2,那么有些产品信息在那里,如果它是类型1,它就是销售线索。我们可以从表1中为每个case_num提供多个销售线索和产品。

表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并收到错误。我想UNION把两个绑在一起,但我不认为我可以在一个更大的选择中为我的情况做。

我得到了什么:

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        

3 个答案:

答案 0 :(得分: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')

* 请不要对答案进行投票,因为我已经解释过这只是为了让用户朝某个方向发展,因为没有人回答这只是为了帮助感谢你。 *

答案 1 :(得分: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>

答案 2 :(得分: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;