1

我目前在导出 1 个表时加入了另外 2 个表,但这会导致行重复。除了复制行来匹配值,是否可以用逗号分隔特定行的值?

这是我现在的表格示例:

id,optioncatid,optionsdesc_sidenote,isproductcode,applytoproductcodes,stockstatus
"325","30","","BRB8PACK","00LDCLU131401C","17"
"325","30","","BRB8PACK","00LDDEV131401C","17"
"325","30","","BRB8PACK","00LDHEI131401C","17"
//etc

这就是我想要的:

id,optioncatid,optionsdesc_sidenote,isproductcode,applytoproductcodes,stockstatus
"325","30","","BRB8PACK","00LDCLU131401C,00LDCLU131401C,00LDHEI131401C, etc...","17"
//etc

可以有数千个值applytoproductcodes,当导出为 XML 时,文件会膨胀到 200+MB。这显然是极其臃肿的。我的 SQL 查询:

SELECT
    Options.ID,
    Options.OptionCatID,
    Options.optionsdesc_sidenote,
    Options.IsProductCode,
    Options_ApplyTo.ProductCode AS ApplyToProductCodes,
    Products.StockStatus AS StockStatus
FROM
    Options
JOIN Options_ApplyTo ON Options.ID = Options_ApplyTo.OptionID
JOIN Products ON Options.IsProductCode = Products.ProductCode
WHERE 
    Options.IsProductCode <> ''
ORDER BY
    Options.ID

编辑:现在我做了更多的研究并将我的代码修改为:

SELECT
    Options.ID,
    Options.OptionCatID,
    Options.optionsdesc_sidenote,
    Options.IsProductCode,
    t.ProductCode AS ApplyToProductCodes,
    Products.StockStatus AS StockStatus
FROM
Options
LEFT JOIN 
    (
        select OptA.ProductCode as ProductCode, OptA.OptionID as OptionID
        from Options_ApplyTo AS OptA, Options
        WHERE  Options.ID = OptA.OptionID
        order by OptA.OptionID
        for xml path('')
    ) t
ON Options.ID = t.OptionID
LEFT JOIN Products 
ON Options.IsProductCode = Products.ProductCode
WHERE 
   Options.IsProductCode <> ''
ORDER BY
   Options.ID

但现在我收到错误没有为“t”的第 1 列指定列。

4

3 回答 3

1

只需将那个吸盘直接放入选择中即可。你不能加入它,因为for xml结果变成了一个标量值......而不是一个表......

SELECT
    Options.ID,
    Options.OptionCatID,
    Options.optionsdesc_sidenote,
    Options.IsProductCode,
    (
        select OptA.ProductCode as ProductCode, OptA.OptionID as OptionID
        from Options_ApplyTo AS OptA
        WHERE  Options.ID = OptA.OptionID
        order by OptA.OptionID
        for xml path('')
    ) as ApplyToProductCodes,
    Products.StockStatus AS StockStatus
FROM
Options
LEFT JOIN Products 
ON Options.IsProductCode = Products.ProductCode
WHERE 
   Options.IsProductCode <> ''
ORDER BY
   Options.ID
于 2013-08-21T02:21:08.710 回答
0

对不起,也许我缺乏经验,我觉得提供的信息不足以让我为你编写测试数据,但我可以给你一个想法,使用 STUFF

DECLARE @t1 TABLE
(
id INT,
optioncatid INT,
optionsdesc_sidenote NVARCHAR(255),
isproductcode NVARCHAR(255),
applytoproductcodes INT
)


INSERT INTO @t1 VALUES 
(325,30,'BRB8PACK','00LDCLU131401C',17),
(325,30,'BRB8PACK','00LDCLU131401C',17),
(325,30,'BRB8PACK','00LDCLU131401C',17)



SELECT id,optioncatid,
STUFF((SELECT ','+optionsdesc_sidenote 
FROM @t1 WHERE id=325 FOR XML PATH('')) , 1 , 1  , '' ),
optionsdesc_sidenote,
isproductcode,
applytoproductcodes FROM @t1
于 2013-08-21T02:13:14.957 回答
0

mysql GROUP_CONCAT函数用逗号连接一列。因此您的查询可以写成

SELECT
    Options.ID,
    Options.OptionCatID,
    Options.optionsdesc_sidenote,
    Options.IsProductCode,
    t.pcodes AS ApplyToProductCodes,
    Products.StockStatus AS StockStatus
FROM
OPTIONS
JOIN 
(SELECT Options_ApplyTo.OptionID, GROUP_CONCAT(Options_ApplyTo.ProductCode) pcodes       
    FROM Options_ApplyTo GROUP BY Options_ApplyTo.OptionID) t
ON Options.ID = t.OptionID
JOIN Products 
ON Options.IsProductCode = Products.ProductCode
WHERE 
   Options.IsProductCode <> ''
ORDER BY
   Options.ID
于 2013-08-21T00:15:07.480 回答