2016-02-22 39 views
1

我正在爲客戶端使用SQL Server,他們給了我一個請求。將SQL Server長列分成多個較短的列

他們有一個表products與許多列,其中之一是articleproducts中約有28,000行。

他們希望創建僅包含products的文章編號,新表articles,但設置,使新表採取article列,並將其分成3列,每列有(最多)10,000行。我解釋說,這不是最好的軟件,但他們堅持(他們是支付我的!)。新表具有列Article1,Artcile2Article3

有人可以幫我解決這個問題嗎?

所有我已經成功至今在正確使用

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

獲得前10000名的文章編號,但現在我堅持就如何剩餘值插入到第二和第三列。我知道我真正需要的是某種UPDATE查詢,但我無法獲得任何地方。

我運行SSMS 2014

+0

樣本數據和預期結果可能有所幫助。 –

+0

像這樣對數據進行非規範化的目的是什麼?我認爲源數據需要保持標準化(每行一篇文章),但如果強烈需要每行有三篇文章,則可以在數據之上創建一個_view_。接下來的觀點是 - 如果產品有四篇文章呢? –

回答

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 
0

您可以使用NOT EXISTS子句,在articles2表中插入時一樣,你可以檢查它像NOT EXISTS(SELECT ARTICLE_ID FROM ARTICLES2)。我希望你明白我的觀點。

除此之外,如果您可以修改主ARTICLE表的結構,那麼您可以添加名爲PROCESSED的列(它將是一個布爾列,默認值爲0)。在articles1表中插入數據後,您可以將PROCESSED列更新爲1,然後您可以處理article2的其餘文章(已處理列值= 0),然後更新處理= 1的文章,類似地文章3.如果您有任何問題,請告訴我。

+0

嘿,感謝您的快速回復!是的,我明白你的意思。 我剛剛以不同的方式解決了這個問題 - 我將第一個10,000行復制到一個表中,第二個10,000行復制到另一個表中,最後8000個複製到另一個表中,最後更新了我的'articles'表列。 – nick

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

1表:@From = 1,@To = 10000

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

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

0

哇...我喜歡聽到別人怎麼知道如何高效地(不)進行數據庫設計,比如你被強迫的。雖然你可能有1,2,3列等給定的表,但你知道它沒有意義,可以嘗試以更高效的格式創建表。然後,給他們一個VIEW,以他們想要的單行格式顯示文章1,2,3。只要它可以有效率,那麼可能會幫助你的情況實現,但給他們他們需要的輸出?

至於做這樣的事情,他們可能需要最近的「x」數量的文章vs第一個,您可能需要添加一列到產品表中,指出用於給定產品的最後一個ARTICLE SEQUENCE。因此,在插入物品表格期間,通過在產品存放列中加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並從中得出結論。