次の問題を完全に SQL (Sybase ASE 12 では ANSI または TSQL) で解決しようとしていますが、カーソルやループベースの行ごとの処理に頼ることはありません。
注:アプリケーション層で同じ目標を達成するソリューションをすでに作成しました(したがって、「SQLでこれをしないでください」と「答える」ことは控えてください)が、原則として(そしてうまくいけばパフォーマンスが向上します)効率的な (カーソルがないなどの) 純粋な SQL ソリューションがあるかどうかを知る。
セットアップ:
次の3つの列を持つテーブルTがあります(すべてNULLではありません):
---- Table T ----------------------------- | item | tag | value | | [int] | [varchar(10)] | [varchar(255)] |
テーブルには一意のインデックスがあります
item, tag
すべてのタグは文字列「TAG##」の形式を持ち、「##」は 1 ~ 99 の数字です
既存のタグは連続しているとは限りません。たとえば、アイテム 13 には「TAG1」、「TAG3」、「TAG10」というタグが含まれている場合があります。
TASK :項目と値のみを持つ別のテーブル T_NEW から一連の新しい行をテーブルに挿入し、それらに新しいタグを割り当てて、一意のインデックスに違反しないようにする必要があります
item, tag
。値の一意性は関係ありません (アイテム + 値は常に一意であると仮定します)。
---- Table T_NEW -------------------------- | item | tag | value | | [int] | STARTS AS NULL | [varchar(255)] |
質問: 次のように、テーブル T_NEW のすべての行に新しいタグを割り当てるにはどうすればよいですか?
T と T_NEW の和集合内のすべての項目とタグの組み合わせは一意です
新しく割り当てられたタグはすべて「TAG##」の形式である必要があります
新しく割り当てられたタグは、理想的には、特定のアイテムで利用可能な最小のものであるべきです。
それが役立つ場合は、
#tags
すべての有効なタグ (TAG1..TAG99、行ごとに 1 つ) を含む 99 行を含む「タグ」列を持つ一時テーブルが既にあると想定できます。