4

これは非常に標準的な初心者の質問ですが、私は小さなコードでこれを行うための専門家の賢い方法を探しています。(手続き型コードとカーソルを使用して、この長い手を行う方法を知っているので、答えのその部分をスキップできます。)基本的に、非正規化データセットがあり、セット処理で正規化テーブルを抽出する必要があります。方法。生データはExcelから取得され、MSSQLからクエリを実行するためのテーブルとして添付します。単一のフィールド(Excel、したがってSQL)には、各製品が参加する部門のコンマ区切りのリストがあります。

データを正規化する必要があることはわかっていますが、Excelから取得されています(ユーザーが正規化するのは現実的ではありません)。各レコードをループする手順(カーソルやステートメントなど)を使用してこれを実行できることはわかっていますが、現在利用可能なツールでは不要のようです。 これらのレコードの「参加者」フィールドを持つ主キーを抽出できる単一のステートメントはありますか?

ソースを次のように考えてください。

ProductIDDepartments
 123      1,3,5,15  
 456      2,4,5,16  

通常のselect*from dbo.split(CommaSepField)を実行しましたが、これは一度に1つのレコードでのみ機能します(テーブル値関数でフィールドの値を指定することはできません。言うまでもなく、これらすべての単一の結果をどのように結合しますかセット?

すべての結果セットを統合することで、共通テーブル式について考えるようになりましたが、(1)展開されたフィールドで主キーを取得する方法、および(2)クエリを機能するようにフォーマットする方法を完全に理解することはできません。

もちろん、出力は次のようになります。

ProductIDDept
 123      1  
 123      3  
 123      5  
 123      15 
 456      2  
 456      4  
 456      5  
 456      16 

StackOverflowとGoogleでこれをかなり調べましたが、当てはまる答えは実際には見つかりませんでした。見逃してしまったことをお詫び申し上げます。リンクを送ってください:D。

4

1 に答える 1

4

CROSS APPLY演算子を使用して結合することにより、実際にカンマ区切りの TVF を使用できます。

select * from Table CROSS APPLY  dbo.split(CommaSepField)
于 2009-08-17T19:58:22.303 に答える