R2

2011-09-13 4 views
1

は、以下の(非常に悪い)テーブルを想像しMSSQL2008R2におけるデザイン:R2

Table "Posts": 
| Id (PK, int) | DatasourceId (PK, int) | QuotedPostIds (nvarchar(255)) | [...] 
|  1  |  1    |        | [...] 
|  2  |  1    |   1     | [...] 
|  2  |  2    |   1     | [...] 
[...] 
| 102322  |  2    |  123;45345;4356;76757  | [...] 

ので、列QuotedPostIdsは、セミコロンで区切ったリストが含まれています自己参照PostIds(子供たち、自宅でそれをしないでください!)。この設計は地獄のように醜いですので、私は新しいnにQuotedPostIdsテーブルから値を抽出したいと思います。このようなメートル関係テーブル:

Desired new table "QuotedPosts": 
| QuotingPostId (int) | QuotedPostId (int) | DatasourceId (int) | 
|  2   |  1   |   1   | 
|  2   |  1   |   2   | 
[...] 
|  102322   |  123   |   2   | 
|  102322   |  45345   |   2   | 
|  102322   |  4356   |   2   | 
|  102322   |  76757   |   2   | 

このテーブルの主キーはいずれかの組み合わせかもしれませんQuotingPostId、QuotedPostId、およびDatasourceID、またはデータベースによって生成された追加の人工キーのいずれかです。

現在のポストテーブルには約6,300,000行が含まれていますが、そのうちの約285,000個だけがQuotedPostIds列に値が設定されています。したがって、これらの行を事前にフィルタリングすることをお勧めします。いずれにせよ、可能であれば、内部MSSQL機能のみを使用して正規化を実行したいと思います。

スプリット関数を中心に扱ったこのトピックに関する他の記事は既に読んでいますが、新しいテーブルの作成方法とデータソース列からの適切な値のコピー方法、それに応じて。

ありがとうございました!

dit:私はそれを考え、最終的に内部のMSSQL機能の代わりに外部のC#プログラムを使用して問題を解決しました。ミカエル・エリクソンの提案を使っている可能性があると思われるので、私は彼のポストを答えとして記します。

+0

いくつかのコードを表示したり、どこに問題があるのでしょうか?スプリットの問題は何ですか?ここでコーディングされたフル機能のソリューションは得られません。 – Jan

+0

私は基本的に、与えられたデータ行からセミコロンで区切られた値を抽出できるテーブル関数を持っています。私が知らないのは、テーブルのすべての行にそれを適用する方法と、結果を新しいテーブルに追加する方法です。 – Shackles

+0

定数と@local_variablesのみがテーブル値関数に渡されるため、テーブル関数を使用するときは、カーソルを宣言してすべての行にステップする必要があります。 – Jan

答えて

1

あなたはテーブルでの使い方が分からない文字列分割機能があると言います。

答えはcross applyのようになります。

select P.Id, 
     S.Value 
from Posts as P 
    cross apply dbo.Split(';', P.QuotedPostIds) as S 
+0

あなたは本当に効果がありますか?私はオンラインで本を読むと、定数と変数だけをテーブル値関数に渡すことができます。 – Jan

+1

@Jan:これがAPPLYのもたらす違いです。 [このBoLの記事](http://msdn.microsoft.com/en-us/library/ms175156.aspx)にも同様の例があります。 –

+0

@Andriy:ポインタありがとう - 知っておいてよかった – Jan