1

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

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

他们希望创建一个articles仅包含来自 的文章编号的新表products,但进行设置以便新表获取该article列并将其拆分为 3 列,每列(最多)10,000 行。我解释说这不是最好的软件,但他们坚持(而且他们是付钱给我的人!)。新表有Article1Artcile2和列Article3

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

到目前为止,我所做的只是正确使用前 10,000 个文章编号

insert into articles (Article1) 
    select top 10000 article
    from products

但是现在我对如何将剩余的值插入第二列和第三列感到困惑。我知道我真正需要的是某种UPDATE查询,但我无处可去。

我正在运行 SSMS 2014。

4

4 回答 4

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
于 2016-02-22T03:41:17.300 回答
0

哇...我喜欢听到其他人如何知道如何有效地(不是)设计数据库,例如您被迫。尽管您可能有给定的第 1、2、3 列等表,并且您知道这没有意义,但请尝试以更有效的格式创建表。然后,给他们一个视图,以他们想要的单行格式显示文章 1、2、3。只要它是有效的,这是否有助于您的情况实施,同时为他们提供所需的输出?

至于做这样的事情,他们可能想要最近的“x”篇文章而不是第一个,你可能想要在产品表中添加一个列,指示用于给定产品的最后一个文章序列。因此,在插入到文章表的过程中,它通过从产品保存列中加 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 并从中提取。

于 2016-02-22T03:44:12.307 回答
0

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

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

于 2016-02-22T03:32:12.527 回答
0

使用表的 ID products

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 个表的@Fromand即可。@To

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

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

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

于 2016-02-22T03:34:21.070 回答