2016-04-13 50 views
0

我来自oracle背景,所以在本网站上搜索时,我发现了无数例子,说明如何使用FOR XML PATH来尝试复制LISTAGG()在oracle中所做的事情。然而,我不知道我想要做的是超出范围,或者我不知道我失去了什么。我找到的每个示例都只使用一个键ID,在我的情况下,我必须使用多个表中的连接。SQL Server连接使用FOR XML困境

以下是表格外观的布局。

CREATE TABLE driven_product 
([PRODUCT_ID] int, [DRIVER_ID] int, [DRIVER_PRODUCT_INPUT_NUM] int); 

INSERT INTO driven_product 
([PRODUCT_ID], [DRIVER_ID], [DRIVER_PRODUCT_INPUT_NUM]) 
VALUES (1, 2, 3); 

CREATE TABLE product_input 
([PRODUCT_ID] int, [PRODUCT_INPUT_NUM] int, [PRODUCT_VALUE_NUM] int, [COLOR] VARCHAR (50)); 

INSERT INTO product_input 
([PRODUCT_ID], [PRODUCT_INPUT_NUM], [PRODUCT_VALUE_NUM], [COLOR]) 
VALUES 
    (1, 3, 1, 'White'), 
    (1, 3, 2, 'Blue'), 
    (1, 3, 3, 'Green'), 
    (1, 3, 4, 'Yellow'), 
    (1, 3, 5, 'Orange'); 

CREATE TABLE driven_price 
[PRODUCT_ID] int, [DRIVER_ID] int, [PRODUCT_VALUE_NUM] int, [PRICE] int); 

INSERT INTO driven_price 
([PRODUCT_ID], [DRIVER_ID], [PRODUCT_VALUE_NUM], [PRICE]) 
VALUES 
    (1, 2, 1, 10), 
    (1, 2, 2, 10), 
    (1, 2, 3, 10), 
    (1, 2, 4, 20), 
    (1, 2, 5, 20); 

的driven_product表连接到使用driven_product.product_id = product_input.product_id AND driven_product.driver_product_input_num = product_input.product_input_num的product_input表。 driven_price表使用 driven_product.product_id = driven_price.product_id,driven_product.driver_id = driven_price.driver_id和product_input.product_value_num = driven_product.product_value_num加入。

我已经得到了到最接近的是:

SELECT STUFF((SELECT '/' + color 
       FROM product_input pi 
       WHERE pi.product_id = dp.product_id 
       AND pi.product_input_num = dp.product_input_num 
       FOR XML PATH('')), 1, 1, ''), dpr.price 
FROM driven_product dp 
INNER JOIN driven_price dpr ON dp.product_id = dpr.product_id 
AND dp.driven_id = dpr.driven_id 

这结合了所有的颜色到每一个价格。

现在很明显的一点是我没有将product_input.product_value_num加入driven_price.product_value_num。当我这样做时,它会将每种颜色分解到自己的行中。

所以这是我挣扎的地方是我需要按价格来做。所以我需要将“白色,蓝色,绿色”和“黄色,橙色”分开。

我试图在SQLFiddle上设置它,但我一直在收到错误。任何你可以提供的指导将不胜感激。

回答

1

你可以使用group by或distinct ..但你的主要问题是你没有通过PRICE过滤FOR XML查询,所以你得到了每种颜色。

SELECT DISTINCT 
     Products = STUFF((
       SELECT '/' + color 
       FROM driven_price dp2 
         JOIN product_input pi ON dp2.Product_Value_Num = PI.Product_Value_Num 
       WHERE dp2.driver_id = dpr.driver_id AND dp2.Price = dp.Price 
       FOR XML PATH('')), 1, 1, ''), 
     dp.[Price] 
FROM driven_product dpr 
     JOIN product_input pri ON dpr.Driver_product_input_num = pri.PRODUCT_INPUT_NUM 
     JOIN driven_price dp ON pri.product_id = dp.product_id 
      AND pri.product_value_num = dp.product_value_num 
0

您需要在外部查询中进行聚合。我认为这会做你想要什么:

SELECT dpr.price, 
     (SELECT '/' + pi.color 
     FROM product_input pi join 
      driven_product dp INNER JOIN 
      ON pi.product_id = dp.product_id AND 
       pi.product_input_num = dp.product_input_num 
     WHERE dp.product_id = dpr.product_id 
     FOR XML PATH('')) 
     ) 
FROM driven_price dpr 
GROUP BY dpr.price; 

注:你只需要stuff()处理缀分隔符。如果你对“/蓝/绿/红”感到满意,那么你不需要它。 stuff()的目的是去除一个前导分离,所以“,蓝色,绿色,红色”变成“蓝色,绿色,红色”。

+0

平时爱你的答案Linoff先生,但我看不到,在所有工作.. :( 每次我尝试运行它,以及我得到一个'不正确syntax'错误。 就修改它尽我所能,带回两种价格都返回每种颜色的问题。 – Shaneis