尝试在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
答案 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;