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 或别名列出

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

4

1 回答 1

1

此查询应尝试直接链接GroupsUser_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 回答