我来自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上设置它,但我一直在收到错误。任何你可以提供的指导将不胜感激。
平时爱你的答案Linoff先生,但我看不到,在所有工作.. :( 每次我尝试运行它,以及我得到一个'不正确syntax'错误。 就修改它尽我所能,带回两种价格都返回每种颜色的问题。 – Shaneis