我的数据库有 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 或别名列出
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] - 这是一个中间文件,用于从 Alias 转换为 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] 表获取组名、访问级别等
我已经尝试过“加入三个或更多表” 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(杰夫的存档方法)没有成功。MSDN 方法确实允许我通过 [Convert] 表正确链接到 [Groups] 或直接链接到 [Groups],但不能同时链接到两者。另一种方法只是让我失望并开车离开。
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