SQL Server长列到多个较短的列

时间:2016-02-22 03:24:09

标签: sql sql-server sql-update sql-insert ssms-2014

我正在为客户端使用SQL Server,他们给了我一个请求。

他们有一个包含许多列的表products,其中一列是articleproducts中有大约28,000行。

他们希望创建一个新表articles,其中仅包含products中的文章编号,但设置为使新表采用article列并将其拆分为3列每个都有(最多)10,000行。我解释说这不是最好的软件,但是他们坚持(而且他们是付钱给我的!)。新表格包含Article1Artcile2Article3列。

有人可以帮我解决这个问题吗?

到目前为止,我所取得的成功是使用

正确获取前10,000个文章编号
insert into articles (Article1) 
    select top 10000 article
    from products

但现在我不知道如何将剩余的值插入第2和第3列。我知道我真正需要的是某种UPDATE查询但我无法到达任何地方。

我正在运行SSMS 2014。

4 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您希望将article行转换为包含3列的表格。这是一个尝试:

;WITH Cte AS(
    SELECT article,
        grp = (ROW_NUMBER() OVER(ORDER BY article) -1) %
                (SELECT CEILING(COUNT(*) / (3 * 1.0)) FROM products)
    FROM products
),
CteFinal AS(
    SELECT *,
        rn = ROW_NUMBER() OVER(PARTITION BY grp ORDER BY article)
    FROM Cte
)
INSERT INTO articles(Article1, Article2, Article3)
SELECT
    Article1 = MAX(CASE WHEN rn = 1 THEN article END),
    Article2 = MAX(CASE WHEN rn = 2 THEN article END),
    Article3 = MAX(CASE WHEN rn = 3 THEN article END)
FROM CteFinal
GROUP BY grp

答案 1 :(得分:0)

您可以使用NOT EXISTS子句,就像在articles2表中插入一样,您可以像NOT EXISTS(SELECT ARTICLE_ID FROM ARTICLES2)一样检查它。我希望你明白我的观点。

除此之外,如果你可以修改主ARTICLE表的结构,那么你可以添加一个名为PROCESSED的列(它将是一个布尔列,默认值为0)。在articles1表中插入数据后,可以将这些文章的PROCESSED列更新为1,然后您可以处理article2的剩余文章(已处理列值= 0),然后更新那些处理过的= = 1,同样为文章3.如果您有任何问题,请告诉我。

答案 2 :(得分:0)

使用表products的ID。

WITH NumberedMyTable AS
(
    SELECT
        Article,
        ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber
    FROM
        Products
);

Insert INTO Articles1
SELECT
    Articles
FROM
    NumberedMyTable
WHERE
    RowNumber BETWEEN @From AND @To

只需更改3个表的@From@To

第一张表:@From = 1,@To = 10000

第二张表:@From = 10001,@To = 20000

第3张表:@From = 20001,@To = 28000

答案 3 :(得分:0)

哇...我喜欢听到其他人如何有效地(而非)有效地设计数据库,例如你被迫。虽然您可能拥有列1,2,3等的给定表,并且您知道它没有意义,但请尝试以更有效的格式创建表。然后,给他们一个VIEW,以单行格式显示他们想要的文章1,2,3。只要它可以有效,可能有助于你的情况实现,但给他们所需的输出?

至于做这样的事情,并且他们可能想要最新的“x”数量的文章与第一个,您可能想要在产品表中添加一列,指示用于给定产品的最后一个文章序列。因此,在插入到article表期间,它通过从产品保留列中添加1来获取下一个序列号。然后,当插入完成后,它会更新下一篇文章的产品保留列。

通过这种方式,产品可以具有类似......

的东西
productid  lastArticleSeq
1          4
2          23
3          18
4          27
etc...

你的文章表可以......

articleid   productid   articleseq
1           1           1
2           4           1
3           1           2
4           3           1
5           4           2
...etc.

这样,如果他们对最后3篇文章的查询感兴趣,你可以使用lastArticleSeq并从中进行绘制。