私のデータベースには 3 つのテーブルがあります: [Groups] - 特定のグループに関する情報、
CREATE TABLE [dbo].[Groups](
[Prime_ID] [nvarchar](20) NULL,
[Name] [nvarchar](100) NULL, -- there are a number of other fields as well
) ON [PRIMARY]
[User_Groups] - これは各ユーザーが属するグループのリストであるため、あまり適切な名前ではありません。グループは、Prime_ID または Alias によってリストされる場合があります
CREATE TABLE [dbo].[User_Groups](
[uPrime_ID] [nvarchar](20) NULL, -- the User's Prime_ID
[gPrime_ID] [nvarchar](20) NULL, -- the Group Prime_ID
[gAlias] [nvarchar](100) NULL, -- the Group alias
) ON [PRIMARY]
[Convert] - これは、エイリアスから Prime_ID に変換するための中間ファイルです。
CREATE TABLE [dbo].[Convert](
[Alias] [nvarchar](100) NOT NULL,
[Prime_ID] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_Convert] PRIMARY KEY CLUSTERED
) ON [PRIMARY]
問題は、User_Groups ファイルに gPrime_ID または gAlias フィールドが入力されていることです。両方埋まっている場合もあります。
Alias フィールドは Prime_ID を参照します。つまり、エイリアス「GeorgeOfTheJungle」は、Prime_ID「BQ47823」を指している可能性があります。
[User_Groups] の行に gPrime_ID が含まれている場合、[Groups] に直接リンクできますが、gAlias がある場合は、最初に [Convert] テーブルにリンクして Prime_ID を取得し、次に [Groups] テーブルにリンクして取得する必要があります。グループ名、アクセスレベルなど
「3 つ以上のテーブルの結合」http://msdn.microsoft.com/en-us/library/aa213227%28v=sql.80%29.aspx (MSDN メソッド) に記載されている方法とそれを試しました。 「SQL Server の条件付き結合」http://weblogs.sqlteam.com/jeffs/archive/2007/04/03/Conditional-Joins.aspx (Jeff のアーカイブ メソッド) から成功しませんでした。MSDN メソッドでは、[Convert] テーブルを介して [Groups] に正しくリンクするか、直接 [Groups] にリンクすることができましたが、両方はできませんでした。もう1つの方法は、私を月に乗せて追い払っただけです。
MSDN メソッド:
SELECT g.name, g.Prime_ID, t.gPrime_ID, t.gAlias
FROM Groups g
INNER JOIN [Convert] cv
ON g.Prime_ID = cv.Prime_ID
JOIN User_Groups t
ON t.gAlias = cv.Alias -- JOIN User_Groups t
-- on t.gPrime_ID = g.Prime_ID
go
ジェフのアーカイブ方法:
SELECT
g.name, g.Prime_ID, t.gPrime_ID, t.gAlias, coalesce(g.Prime_ID, cv.Alias) AS gp
FROM
[Groups] g
LEFT OUTER JOIN
[User_Groups] t ON t.gPrime_ID = g.Prime_ID
LEFT OUTER JOIN
[Convert] cv
ON g.Prime_ID = cv.Prime_ID
JOIN User_Groups ON t.gAlias = cv.Alias
go
MS Server 2012 Express を使用しています