SQL 服务器长列分成多个较短的列

SQL Server long column into multiple shorter columns

我正在为客户使用 SQL 服务器,他们给了我一个请求。

他们有一个 table products,其中有很多列,其中一列是 articleproducts.

中大约有 28,000 行

他们希望创建一个新的 table articles,其中仅包含来自 products 的文章编号,但要进行设置以使新的 table 采用 article 列并将其拆分为 3 列,每列(最多)10,000 行。我解释说这不是执行此操作的最佳软件,但他们坚持(他们是付钱给我的人!)。新的 table 包含列 Article1Artcile2Article3

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

到目前为止,我所取得的成功只是正确使用了前 10,000 个文章编号

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

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

我是 运行 SSMS 2014。

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

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

使用 table 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

只需将 @From@To 更改为 3 tables。

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

第二个 table : @From = 10001, @To = 20000

第三 table : @From = 20001, @To = 28000

如果我对你的问题的理解正确,你想将 article 的行转换为具有 3 列的 table。这是一个尝试:

;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、2、3 列等的给定 table,并且您知道它没有意义,但请尝试以更有效的格式创建 table。然后,给他们一个视图,以他们想要的单行格式显示文章 1、2、3。只要它是高效的,是否可以帮助您的情况实现,同时为他们提供所需的输出?

至于做这样的事情,他们可能想要最近的 "x" 篇文章而不是第一篇,您可能需要在产品 table 中添加一列来指示最后一篇文章序列用于给定的产品。因此,在插入文章 table 期间,它通过从 products holding 列中加 1 来获得下一个序列号。然后,当插入完成时,它会更新下一篇文章的产品持有列。

这样,一个产品可以有类似...

productid  lastArticleSeq
1          4
2          23
3          18
4          27
etc...

而您的文章 table 可能有...

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

这样,如果他们对最后 3 篇文章的查询感兴趣,您可以使用 lastArticleSeq 并从中提取。