全て、
動的SQLを使用せずに、あるテーブルから別のテーブルへの挿入を実行しようとしています。ただし、現時点で私が考えている唯一のソリューションは動的SQLを使用しています。同様のシナリオを検索するのは困難です。
詳細は次のとおりです。
私の出発点は、次の従来のテーブルです。
CREATE TABLE [dbo].[_Combinations](
[AttributeID] [int] NULL,
[Value] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (16, N'1')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (16, N'2')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Red')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Orange')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Yellow')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Green')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Blue')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Indigo')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'Violet')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'A')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'B')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'C')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'D')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'E')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'F')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'G')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'H')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'I')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'J')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'K')
SELECT * FROM _Combinations
_Combinations テーブルには、さまざまなタイプの属性のキー (AttributeID) と、各属性の可能な値 (Value) が含まれています。
この場合、複数の可能な値を持つ 3 つの異なる属性がありますが、さらに多く (最大 10) 存在する可能性があります。
次に、各値の可能なすべての組み合わせを作成し、それを正規化して保存する必要があります。これは、可能な組み合わせごとに他のデータが保存されるためです。各組み合わせを構成する属性キーと値の両方を格納する必要があるため、各組み合わせを表示するための単なるクロス結合ではありません。属性の各組み合わせを格納するターゲット テーブルは次のとおりです。
CREATE TABLE [dbo].[_CombinedAttributes](
[GroupKey] [int] NULL,
[AttributeID] [int] NULL,
[Value] [varchar](50) NULL
) ON [PRIMARY]
したがって、上記のデータを使用した属性の組み合わせレコードは、ターゲット テーブルでは次のようになります。
GroupKey AttributeID Value
1 8 A
1 16 1
1 28 Red
2 8 B
2 16 1
2 28 Red
これにより、必要なものが得られます。各グループには識別子があり、各グループを構成する属性 ID と値を追跡できます。2 つのスクリプトを使用して、_Combinations テーブルから _CombinedAttributes テーブルの形式を取得しています。
-- SCRIPT #1
SELECT Identity(int) AS RowNumber, * INTO #Test
FROM (
SELECT AttributeID AS Attribute1, Value AS Value1 FROM _Combinations WHERE AttributeID = 8) C1
CROSS JOIN
(
SELECT AttributeID AS Attribute2, Value AS Value2 FROM _Combinations WHERE AttributeID = 16) C2
CROSS JOIN
(
SELECT AttributeID AS Attribute3, Value AS Value3 FROM _Combinations WHERE AttributeID = 28) C3
-- SCRIPT #2
INSERT INTO _CombinedAttributes
SELECT RowNumber AS GroupKey, Attribute1, Value1
FROM #Test
UNION ALL
SELECT RowNumber, Attribute2, Value2
FROM #Test
UNION ALL
SELECT RowNumber, Attribute3, Value3
FROM #Test
ORDER BY RowNumber, Attribute1
上記の 2 つのスクリプトは機能しますが、明らかにいくつかの欠点があります。つまり、扱っている属性の数を知る必要があり、ID がハードコーディングされているため、これをその場で生成することはできません。私が思いついた解決策は、_Combinations テーブルの属性をループしてスクリプト 1 とスクリプト 2 の文字列を作成し、長くて面倒な実行文字列を生成することですが、必要に応じて投稿できます。動的SQLなしで最終的な挿入のフォーマットを引き出す方法を誰かが見ることができますか?
このルーチンはあまり実行されませんが、文字列の構築を実行せずに直接 SQL を使用したいほど十分に実行されます。
前もって感謝します。
アップデート:
2 番目のデータセットを使用すると、Gordon のコードは正しい結果を返さなくなりました。最後に 1 つの属性しかないグループを作成していますが、この 2 番目のデータセットでは、Nathan のルーチンで正しい行数を取得します (最終結果の行数は 396 にする必要があります)。 . しかし、コメントで述べたように、最初のデータセットを使用すると、反対の結果が得られます。ゴードンは正しく返されますが、ネイサンのコードには重複があります。私は途方に暮れています。2 番目のデータセットは次のとおりです。
DROP TABLE [dbo].[_Combinations] GO
CREATE TABLE [dbo].[_Combinations]( [AttributeID] [int] NULL, [Value] varchar NULL ) ON [PRIMARY] GO
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (16, N'1')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (16, N'2')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'<=39')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'40-44')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'45-49')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'50-54')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'55-64')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (28, N'65+')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'AA')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'JJ')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'CC')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'DD')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'EE')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'KK')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'BB')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'FF')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'GG')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'HH')
INSERT [dbo].[_Combinations] ([AttributeID], [Value]) VALUES (8, N'II')