2013-11-25 5 views
2

Попытка сделать выбор в SQL Server 2005 и отправить вывод в xml. Таблица 2 представляет собой таблицу общего использования с различными типами информации. Некоторая информация о продукте находится там, если это тип 2, это продажа свинец, если это тип 1. Мы можем иметь несколько потенциальные продажи и продукты для каждого case_num из таблицы 1.SQL select output to 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 и получал ошибки. Я думал о 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

В каком формате XML вы хотите получить свой результат? –

+1

Это довольно стандартный вывод XML .. – OGHaza

+0

и каков ваш ожидаемый результат? –

ответ

0

Друг предложил только присоединиться один раз, а затем отфильтровывая выбор на основе аргументов case, и я думаю, что это сработает.Спасибо людям

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 Боб Смит адрес 1 имя2 2.00 Боб Смит адрес 1 user3023480

+0

и делает вывод повторным подмножеством продукта – user3023480