我正在为客户端使用SQL Server,他们给了我一个请求。
他们有一个包含许多列的表products
,其中一列是article
。 products
中有大约28,000行。
他们希望创建一个新表articles
,其中仅包含products
中的文章编号,但设置为使新表采用article
列并将其拆分为3列每个都有(最多)10,000行。我解释说这不是最好的软件,但是他们坚持(而且他们是付钱给我的!)。新表格包含Article1
,Artcile2
和Article3
列。
有人可以帮我解决这个问题吗?
到目前为止,我所取得的成功是使用
正确获取前10,000个文章编号insert into articles (Article1)
select top 10000 article
from products
但现在我不知道如何将剩余的值插入第2和第3列。我知道我真正需要的是某种UPDATE
查询但我无法到达任何地方。
我正在运行SSMS 2014。
答案 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)
至于做这样的事情,并且他们可能想要最新的“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并从中进行绘制。