我有 2 个表,它们共享一个公共的“类型”表类型表如下:
CREATE TABLE [ModifierType](
[ModifierTypeID] [int] NOT NULL,
[Code] [varchar](10) NOT NULL,
[Name] [varchar](50) NOT NULL,)
CREATE TABLE [UserRequest](
[UserRequestID] [int] NOT NULL,
[Name] [varchar](50) NOT NULL,)
CREATE TABLE [Matrix](
[MatrixID] [int] NOT NULL,
[Name] [varchar](50) NOT NULL,)
CREATE TABLE [UserRequestModifier](
[UserRequestModifierID] [int] NOT NULL,
[UserRequestID] [int] NOT NULL,
[ModifierTypeID] [int] NOT NULL,
[Value] [varchar](50) NOT NULL,)
CREATE TABLE [MatrixModifier](
[MatrixModifierID] [int] NOT NULL,
[MatrixID] [int] NOT NULL,
[ModifierTypeID] [int] NOT NULL,
[Value] [varchar](50) NOT NULL,)
其他的是 UserRequestModifier 表和一个“MatrixModifier”表,其中包含用于确定访问请求的规则应该被提供。在这种情况下,矩阵只是指一组规则,这些规则将授予对特定应用程序或组的访问权限。这两个表各有一个 ModifierTypeID,它将链接这两个表和一个用于查找匹配的值字段。
但是,每个 UserRequest/Matrix(修饰符表的父项)都可以有多个修饰符记录。
我需要做的是找到 UserRequestModifiers 满足所有 MatrixModifier 要求的所有 Matrix 记录。基本上,我想忽略任何具有 1 个修饰符值且与任何 UserRequestModifier 值都不匹配的 MatrixID。
到目前为止,我有一个可以执行此操作的查询,但对我来说似乎有点倒退,因为我必须首先找到 UserRequestModifiers 不满足子选择要求的所有 MatrixID。然后获取不在这些结果中的记录,如下所示:
SELECT
UR.[UserRequestModifierID]
,UR.[ModifierTypeID]
,UR.[Value] AS [URValue]
,MM.[Value] AS [MMValue]
,MM.[MatrixModifierID]
,MM.[MatrixID]
,MM.[ModifierTypeID]
,M.[MatrixID]
FROM
AMP.[UserRequestModifier] AS UR
LEFT OUTER JOIN AMP.[MatrixModifier] AS MM
ON (MM.[ModifierTypeID] = UR.[ModifierTypeID])
LEFT OUTER JOIN AMP.[Matrix] AS M
WHERE
UR.[UserRequestID] = @UserRequestID
AND M.[MatrixID] IS NOT NULL
AND M.[MatrixID] NOT IN
(SELECT
DISTINCT MM.[MatrixID]
FROM
AMP.[UserRequestModifier] AS UR
LEFT OUTER JOIN AMP.[MatrixModifier] AS MM
ON (MM.[ModifierTypeID] = UR.[ModifierTypeID])
WHERE
UR.[UserRequestID] = @UserRequestID
AND (CASE WHEN LTRIM(RTRIM(MM.[Value])) = LTRIM(RTRIM(UR.[Value])) THEN 1 ELSE 0 END) = 0
AND MM.[MatrixID] IS NOT NULL)
ORDER BY M.[MatrixID], MM.[ModifierTypeID]
我知道这有点难以理解,但我希望有人能指出我明显遗漏的东西。