「タイプ」の共通テーブルを共有する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」テーブルです。この場合のマトリックスは、特定のアプリケーションまたはグループへのアクセスを許可する一連のルールを指します。これら 2 つのテーブルにはそれぞれ、2 つをリンクする ModifierTypeID と、一致を見つけるために使用される値フィールドがあります。
ただし、各 UserRequest/Matrix (モディファイア テーブルの親) はそれぞれ複数のモディファイア レコードを持つことができます。
私がする必要があるのは、UserRequestModifiers がすべての MatrixModifier 要件を満たすすべての Matrix レコードを見つけることです。基本的に、UserRequestModifier 値のいずれにも一致しない修飾子値が 1 つでもある MatrixID は無視したいと考えています。
これまでのところ、それを行うクエリがありますが、UserRequestModifiers がサブセレクトの要件を満たしていないすべての MatrixIDs を最初に見つける必要があるため、少し後ろ向きに思えます。次に、これらの結果に含まれていないレコードを次のように取得します。
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]
これを追うのは少し難しいことはわかっていますが、誰かが私が見逃している明らかな何かを指摘してくれることを願っています.