状況: 3 つのソース テーブル:
1. ユーザーfirstName
(一意の ID と、givenName
、などのユーザー固有のプロパティを含むStreetAddress
)
2. MigrationFeatures (一意の ID と を含むFeature_Name
)
3. Link_Users_and_Features ( と の一意の ID と列 (int) の両方Users
を含むFeatures
)Status
リンク テーブルでは、ユーザーごとに、Feature
テーブル内の行と同じ数の行があり、これらの各行 (ユーザーごと) は正確に 1 つの にリンクされていますFeature
。各リンク行には、特定のユーザーの特定の移行ステータスに応じて、異なる値を持つステータス値列も含まれFeature
ます。
目標:
ユーザーごとに 1 つの行を返し、その特定のユーザーのそれぞれの移行ステータスを含む完全に動的なクエリ/SP を持つ- 各移行ステータス列は、対応するテーブルのFeature
名前に従って命名する必要があります。テーブルに追加する場合、目的のクエリ コードを手動で変更する必要はありません。Feature_Name
Feature
Features
Feature
Feature
ヒント:Feature
テーブルには、ユーザーごとにこの追加の列を作成する挿入トリガーが既にあり、関連する列に参照整合性があるため、すべてのユーザーは常にすべてのリンク テーブルに対応するすべての行を持ちますFeatures
。
なぜ私はそれを持ちたいのですか:
これまで、すべてのユーザー固有の列 (Name, givenName, StreetAddress,
など) とすべての移行機能ステータス列 (SIDhist migrated, homefolder migrated,
など) を含む 1 つのテーブルがあり、すべてのユーザーのすべての移行ステータス データが保持されていました。
残念ながら、これは完全に静的であり、新しい を追加するたびに、Feature
このマスター テーブルを変更する必要があります。Feature
将来的には、スキルの低い人が基礎となるシステムを使用し、DB コードやスキーマにはアクセスせず、およびuser
テーブルにレコードを追加するだけになるでしょう。
ユーザーDBを作成するコードは次のとおりです。
CREATE TABLE [dbo].[Users](
[Users_ID] [int] IDENTITY(1,1) NOT NULL,
[FMOUser_givenName] [nvarchar](max) NULL,
[FMOUser_sn] [nvarchar](max) NULL,
[FMOUser_streetAddress] [nvarchar](max) NULL,
[ExcludeFromMigration] [bit] NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Users_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Features テーブルを作成するコードは次のとおりです。
CREATE TABLE [dbo].[Features](
[Features_ID] [int] IDENTITY(1,1) NOT NULL,
[Feature_Name] [nvarchar](max) NOT NULL
CONSTRAINT [PK_Features] PRIMARY KEY CLUSTERED
(
[Features_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
リンク テーブルを作成するコード:
CREATE TABLE [dbo].[link_Users__with__Features](
[link_Users__with__Features_ID] [int] IDENTITY(1,1) NOT NULL,
[FMO_Users_ID] [int] NOT NULL,
[Features_Migration_Core_ID] [int] NOT NULL,
[StatusValue] [int] NOT NULL,
[Description] [nvarchar](max) NULL,
CONSTRAINT [PK_link_Users__with__Features] PRIMARY KEY CLUSTERED
(
[link_Users__with__Features_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
私はすでに何をrResearchしましたか?
次の例を見つけました。
http://www.dbforums.com/microsoft-sql-server/1673127-view-multiple-records-single-row.html
Features
これは、複数の行から単一の列を新しい列名の下に1つの行に配置しますが、動的ではありません-つまり、テーブルの対応する「機能」行からターゲット列名を引き出さず、動的を処理することもできませんの数Features
。
私はT-SQLに比較的慣れていないので、この課題を解決する方法がわかりません。
これはスタック オーバーフローでの私の最初の質問なので、形式を逃した場合はご容赦ください。私を修正してください。私はもっとうまくやります:-)
ヒント: 私は自分の質問に対して提案された「重複」を調べましたが、私の質問に少しでも一致するものはないようです。