2

アプリケーションの SQL クエリを書くのに苦労しています。以下に、データベース内のいくつかのテーブルのスクリーンショットを示します。

ここに画像の説明を入力 ここに画像の説明を入力

アプリケーションの一部がどのように機能するかを説明させてください。それから、SQL クエリで発生している問題を説明できます。

ユーザーは自分のシステム ( dbo.Form) でアプリケーション フォームを作成できます。申請書はいくつかのセクションで構成されており、そのセクションの 1 つが職歴 ( dbo.FormEmployment) です。雇用記録には、雇用者名、開始日などの詳細だけでなく、グレード ID も含まれます。ユーザーは、1 つ以上の雇用レコードをテーブルに追加できますdbo.FormEmployment

システム管理者は、システムにシフト ( ) を追加し、dbo.Shiftグレードをシフトに割り当てることもできます。これらのグレードはdbo.ShiftGrade表に記録されます。シフトには 1 つ以上のグレードを割り当てることができます。つまり、1、2、3、4、または 5 つのグレードを割り当てることができます。

システム管理者がシフトとシフトの等級を追加したら、SQL クエリを実行して、等級がシフトに割り当てられた等級と一致するユーザーのリストを返したいと思います (ユーザーが雇用レコードを追加するときに等級を追加することを思い出してください)。 )。

機能する次の SQL クエリを作成しましたが、このクエリの問題は、シフトに割り当てられたグレードと一致するグレードを持つユーザーのリストを返すことです。

SELECT   u.userID, u.userTypeID, u.firstName, u.lastName, u.email, u.password, 
u.contactNumber, u.organisationID, u.emailVerificationCode, u.mobileVerificationCode, 
u.userStatusID, u.AddedBy, u.AddedDate, u.ModifiedBy, u.ModifiedDate
FROM     [User] u
--Check Grades Match
WHERE    u.userID IN
     (
     SELECT f.locumID
     FROM   dbo.Form f, dbo.FormEmployment emp
     WHERE  f.formID = emp.formID
     AND    emp.statusID = 101
     AND    emp.workYN = 1
     AND    emp.gradeID IN (
             select gradeID from dbo.ShiftGrade where shiftID = @p0
             )
     )

これを行うために IN ステートメントを使用していることがわかります。ただし、シフトに割り当てられているのとまったく同じグレードに一致するユーザーのリストのみを返したいと考えています。したがって、シフトに 3 つのグレードが割り当てられている場合、まったく同じ 3 つのグレードを持つユーザーのリストが返されるようにします。

長い投稿で申し訳ありませんが、このように説明する方が良いと思いました。これに関するフィードバックやヘルプをいただければ幸いです。

4

1 に答える 1

1
select u.*
from dbo.Users u
join dbo.Form f on u.? = f.formId
join dbo.FormEmployment fe on fe.formId = f.formId
join dbo.Grade g on g.gradeId =  fe.gradeId
join dbo.ShiftGrade shg on shg.gradeId =g.gradeId
join dbo.Shift sh on sh.shiftId = shg.shiftId
where
    sh.shiftId = -- recently added shift id
and g.gradeId == -- recently added grade id
于 2012-07-06T13:56:14.620 に答える