1

私のデータベースには 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 を使用しています

4

1 に答える 1

1

このクエリは、直接、または中間テーブルを介してリンクGroupsを試行する必要があります。User_Groups

select  *
from    Groups g
left join
        Convert c
on      c.Prime_ID = g.Prime_ID
left join
        User_Groups ug
on      ug.gPrime_ID = g.Prime_ID
        or ug.gAlias = g.gAlias
于 2013-01-21T09:22:18.753 に答える