2012-02-09 12 views
0

テーブル構造は、最初の6列がコンポジットキーとなります。SQLコンポジットキーを含むすべてのレコードの選択

col1 col2 col3 col4 col5 col6 col7 col8 
A1 A2 A3 A4 A5 1 xx yy 
A1 A2 A3 A4 A5 2 xxx yyy 
A1 A2 A3 A4 A5 3 a b 
A1 B2 A3 A4 A5 4 aa bb 
B1 A2 A3 A4 A5 5 aaa bbb 
B1 B2 B3 B4 B5 6 d e 
B1 B2 B3 B4 B5 7 dd ee 
B1 B3 C3 B4 B5 8 ddd eee 

Iは、任意のポインタやヘルプが理解される

A1 A2 A3 A4 A5 xx yy xxx yyy a b 
A1 B2 A3 A4 A5 aa bb 
B1 A2 A3 A4 A5 aaa bbb  
B1 B2 B3 B4 B5 d e dd ee 
B1 B2 C3 B4 B5 ddd eee 

以下のような値を返すストアドプロシージャを必要とします。

+0

結果には、最初の5つの値が十分に単純です。しかし、各行ごとに異なる数の列があります。 SQLはそれをサポートしていません。あなたは "xx、yy、xxx、yyy、a、b"(例えば)を単一の文字列として返すようにしますか?もしそうなら、なぜですか?このような非正規化は、アプローチの中で何かが間違っているように感じます。あなたが達成したいことが分かっていれば、別のアプローチを提供することができます。 – MatBailie

+0

返信ありがとうございます。最初の5つの列が行のために同じであれば、私は最初の5つの列の重複行に応じて列が動的に変更されるtable.yesの単一の行に値を表示することができます。 sql queries.iは可能かどうかはわかりません。 – vijay

+1

短い答えは "いいえ、動的な列数を持つことはできません"です。この結果が*必要なものを記述した場合、代替案を提供できる可能性があります。 – MatBailie

答えて

0

あなたはこのような結果が必要な場合:

A1 A2 A3 A4 A5 xx,yy,xxx,yyy,a,b 
A1 B2 A3 A4 A5 aa,bb 
B1 A2 A3 A4 A5 aaa,bbb 
B1 B2 B3 B4 B5 d,e,dd,ee 
B1 B3 C3 B4 B5 ddd,eee 

その後、簡単なクエリを実行します:

select COL1 
     ,COL2 
     ,COL3 
     ,COL4 
     ,COL5 
     ,LISTAGG(COL7 || ',' || COL8, ',') within group (order by COL6) 
    from TAB1 
group by COL1, COL2, COL3, COL4, COL5 
order by COL1, COL2, COL3, COL4, COL5 

をあなたは、動的SQLを作成するために必要な列の動的な数を取得するには。それに関するガイドについては、thisの記事を参照してください。

+0

は、私の答えは、OracleのためだったLISTAGG – vijay

+0

が何であるかを取得しておりません。質問のタグを更新してSQL Serverを示します。これを見てください(http://www.simple-talk。SQL-Serverの行を連結する方法については、com/sql/t-sql-programming/concatenating-row-values-in-transact-sql /)の記事を参照してください。 –

0

最初に、クエリの標準結果セットとして、可変数の列を返すことはできませんが、次にバインドできるxml列(SQL 2005でintoduced)http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspxの列に戻ることができます。バインディングは動的にする必要があります。ピボット関数http://msdn.microsoft.com/en-us/library/ms177410.aspxを使用すると、必要な形式でデータを表示することができます。また、前述のように動的SQLを使用することもできます。これを行う場合は、ストアドプロシージャ内で動的SQLを生成し、sp_executesqlを使用して生成する文字列を実行する必要がありますhttp://msdn.microsoft.com/en-us/library/ms175170.aspx注射攻撃から保護するために、おそらくパラメータhttp://support.microsoft.com/kb/262499を渡す必要があります。かなりのステップを学ぶ...しかし、各ステップは特に困難ではなく、その素晴らしい運動です!

+0

例は大きな助けになるでしょう... – vijay

+0

よくあるリンクのほとんどはサンプルスクリプトを持っています。私は基本的な選択から始まり、その動作を証明し、その選択とsp_executesqlを生成するスクリプトを作成します。その後、ステップごとに、生成スクリプトを変更し、各バージョンを保存して、完全に台無しになったときに戻ることができます。それは学ぶための非常に強力なテクニックです、そして、私は本当に学ぶ唯一の方法が潜んでそれを試みることが恐れています。 –

0

これを確認してください。役立つかどうかは分かりません。私はSQL Server 2008を使用し、それはあなたのrequirmentsごとに結果を返します。

SELECT col1, col2, col3, col4, col5, 
(SELECT ' ' + col7 + ' ' + col8 FROM TABLE1 t1 
WHERE t1.col1 = t.col1 and t1.col2 = t.col2 and 
t1.col3 = t.col3 and t1.col4 = t.col4 and t1.col5 = t.col5 
ORDER BY col6 
FOR XML PATH('')) AS mearge_col 
FROM TABLE1 t 
GROUP BY col1, col2, col3, col4, col5 
関連する問題