2

目的: ユーザーに割り当てられた役割に基づいて、ワークリストでアルファ スプリットを実行します。以下のロジックは、ユーザーが 1 つのアルファ スプリット (例: A-CZZZ) しか持っていない場合に機能しますが、一部のユーザーが複数のスプリット (例: A-CZZZ と T-ZZZZ) を持つ柔軟性が必要です。

高レベル:

SELECT Name
FROM PatientDatabase
WHERE Name Between
   (SELECT UserRole.AlphaFrom
    FROM UserRole
    WHERE UserRole.HasRole = 1)
    AND
   (SELECT UserRole.AlphaThru
    FROM UserRole
    WHERE UserRole.HasRole = 1)

患者データベースの潜在的な名前:

ABC,PERSON
LMN,PERSON
XYZ,PERSON

現在のユーザーには 2 つの UserRole (アルファ スプリット) があります。

A-CZZZ
T-ZZZZ

戻りたい:

ABC,PERSON
XYZ,PERSON

以下のセキュリティ関連のロジックを考えると、サブクエリが必要になる可能性があると思います。

情報:

-'Roledef->ReportingCategory1->Name' is the AlphaFrom
-'Roledef->ReportingCategory2->Name' is the AlphaThru

アルファ分割の現在のロジックは、1 つだけ (または複数の場合は最初の分割) の場合に機能します

AND T.PatId->PatNm BETWEEN
    (SELECT E2.Roledef->ReportingCategory1->Name
    FROM SECURITYPLUS.USR S2, SecurityPlus.UsrETMRole E2,
    SecurityPlus.UsrETMApplication A2
    WHERE A2.USR = S2.USERNAME AND
    E2.USRETMAPPLICATION = A2.ID AND S2.Username = ? 
    AND E2.Roledef->Name ['Alpha')
    AND
    (SELECT E3.Roledef->ReportingCategory2->Name
    FROM SECURITYPLUS.USR S3, SecurityPlus.UsrETMRole E3,
    SecurityPlus.UsrETMApplication A3
    WHERE A3.USR = S3.USERNAME AND
    E3.USRETMAPPLICATION = A3.ID AND S3.Username = ?  
    AND E3.Roledef->Name ['Alpha')

context の SQL ロジック全体:

SELECT
T.Id,
T.PatId->Mrn,
T.PatId->PatNm,
T.Invoice,
T.Invoice->Fsc,
T.Stage->Name As Stage,
T.Status->Name As Status,
T.Invoice->InvBal,
T.ReviewDate,
T.HasNoteFlag

FROM
TaskManager.Task T

WHERE
T.TaskNm->Name = 'Insurance Followup'

AND T.Status IN (SELECT ID FROM Dict.ETMTaskStatus TS
                 WHERE StatusType NOT IN ('DELETED','DONE'))

AND T.Invoice->Fsc->EtmRole IN
    (SELECT E1.Roledef
    FROM SECURITYPLUS.USR S1, SecurityPlus.UsrETMRole E1,
    SecurityPlus.UsrETMApplication A1
    WHERE A1.USR = S1.USERNAME AND
    E1.USRETMAPPLICATION = A1.ID AND S1.Username = ?)

AND T.PatId->PatNm BETWEEN
    (SELECT E2.Roledef->ReportingCategory1->Name
    FROM SECURITYPLUS.USR S2, SecurityPlus.UsrETMRole E2,
    SecurityPlus.UsrETMApplication A2
    WHERE A2.USR = S2.USERNAME AND
    E2.USRETMAPPLICATION = A2.ID AND S2.Username = ? 
    AND E2.Roledef->Name ['Alpha')
    AND
    (SELECT E3.Roledef->ReportingCategory2->Name
    FROM SECURITYPLUS.USR S3, SecurityPlus.UsrETMRole E3,
    SecurityPlus.UsrETMApplication A3
    WHERE A3.USR = S3.USERNAME AND
    E3.USRETMAPPLICATION = A3.ID AND S3.Username = ?  
    AND E3.Roledef->Name ['Alpha')

この次のロジックは、必要なテーブルを返しますが、これを使用する between ステートメントを取得する方法がわかりません。

SELECT E2.Roledef->ReportingCategory1->Name As AlphaFrom,
       E2.Roledef->ReportingCategory2->Name As AlphaThru
    FROM SECURITYPLUS.USR S2, SecurityPlus.UsrETMRole E2,
    SecurityPlus.UsrETMApplication A2
    WHERE A2.USR = S2.USERNAME AND
    E2.USRETMAPPLICATION = A2.ID AND S2.Username = ? 
    AND E2.Roledef->Name ['Alpha'

戻り値:

AlphaFrom    AlphaThru
A            CZZZ
T            ZZZZ

サブクエリに参加する試みが失敗したため、これを達成するにはサブクエリを放棄する必要があると思いますが、続行する方法がわかりません。

4

1 に答える 1

0

私の最終的な答えは、Role ディクショナリにカスタム フィールドを作成し、アルファベットの各文字に対して Role を作成し、「BETWEEN」ではなく「IN」ステートメントを使用することでした。

高レベルの例を使用します。

SELECT Name
FROM PatientDatabase
WHERE LEFT(Name,1) In
   (SELECT UserRole.Alpha
    FROM UserRole
    WHERE UserRole.HasRole = 1)
于 2013-05-21T12:41:30.283 に答える