0

求人ポータルのような検索エンジンを構築しようとしています。私の質問は、特に資格に関するものです。エンド ユーザーは、単一または一連の資格と分野の組み合わせを持つ従業員を照会するか、資格と分野の組み合わせのリストを提供して、指定された資格と分野の組み合わせのいずれかを行ったすべての従業員を尋ねることができます。私のスクリプトは次のとおりです。

declare @Qualification table(QualId int identity primary key, Qualification varchar(100))
declare @Discipline table(DispId int identity primary key, Discipline varchar(100))
declare @Emp table(Eid int identity primary key, EName varchar(100))
declare @EmpQualification table(Eid int, QualId int, DispId int)
declare @ReqData table(QualId int, DispId varchar(100))
declare @AllMandatory char(1)

insert into @Qualification
select 'Diploma' union
select 'B.E' union
Select 'MBA' union
select 'MCA' union
Select 'B.Sc' union
Select 'B.Com'

insert into @Discipline
select 'HR' union
select 'IT' union
Select 'Computers' union
select 'Agriculture' union
Select 'Civil'

insert into @Emp
select 'SANTHOSHANAND M' union
select 'VENKATA VEERA JAGADEESH MANNE' union
select 'E.SURESH KUMAR' union
select 'E HARIHARA PUTHIRAN' union
select 'SOUMYAJIT MOHANTY' union
select 'TANMOY DAS' union
select 'PANAKANTI SANTHOSH' union
select 'G NAVEEN KUMAR' union
select 'VIJAY LOGANATHAN' union
select 'SAI KIRAN GANDHE'

INSERT INTO @EmpQualification
SELECT 1,1,3 UNION
SELECT 1,5,4 UNION
SELECT 2,2,2 UNION
SELECT 2,6,3 UNION
SELECT 3,3,3 UNION
SELECT 3,2,3 UNION
SELECT 4,4,2 UNION
SELECT 4,2,3 UNION
SELECT 5,5,4 UNION
SELECT 5,3,1 UNION
SELECT 6,6,3 UNION
SELECT 6,4,3 UNION
SELECT 7,1,3 UNION
SELECT 7,5,5 UNION
SELECT 8,2,3 UNION
SELECT 8,6,3 UNION
SELECT 9,3,1 UNION
SELECT 9,1,3 UNION
SELECT 10,4,5 UNION
SELECT 10,2,5 

SELECT e.Eid, E.EName Name, ql.Qualification, d.Discipline FROM @Emp E
INNER JOIN @EmpQualification Q ON E.Eid = Q.Eid
INNER JOIN @Qualification QL ON Q.QualId = QL.QualId
INNER JOIN @Discipline D ON Q.DispId = D.DispId

insert into @ReqData
select 1,'Any' union
select 5,4

set @AllMandatory = 'N'

if @AllMandatory = 'N'
select * from @Emp where Eid in (
select distinct q.Eid from @EmpQualification q
inner join (select distinct QualId, convert(int,DispId) DispId from @ReqData where DispId <> 'Any') f on q.QualId = f.QualId and q.DispId = f.DispId
union
select distinct q.Eid from @EmpQualification q
inner join (select distinct QualId from @ReqData where DispId = 'Any') f on q.QualId = f.QualId)
--else
-- My recursive procedure goes here, which consumes lot of time

私のユーザーのサンプルクエリは次のとおりです。

ここに画像の説明を入力

これは、以下のように私の@ReqDataテーブルに表示されます

ここに画像の説明を入力

上記のすべての基準を満たすすべての従業員。@AllMandatoryこれは私の変数を通してキャプチャされます

set @AllMandatory = 'Y'

上記のクエリでは、B.Com に所属し、HR で MBA を取得したすべての従業員が返されます。以下はクエリ結果です

Eid EName
1   E HARIHARA PUTHIRAN

同じ@ReqDataテーブルで、@AllMandatoryが に設定されてNいる場合、結果は次のようになります。これは、任意の分野で B.Com を行ったすべての従業員、または MBA HR を行ったすべての従業員を意味します。

Eid EName
1   E HARIHARA PUTHIRAN
5   SAI KIRAN GANDHE
7   SOUMYAJIT MOHANTY
9   VENKATA VEERA JAGADEESH MANNE

@ReqData50 ~ 60 行になることもあります。これを達成するには、ループまたはストアド プロシージャの再帰を使用するしかありません。私は約 50,000 人の従業員と約 2,00,000 の資格を持っており、これらも増え続けています。したがって、このループと再帰により、システムが遅くなります。これを解決するためのより良い簡単な方法はありますか? 単一のクエリで実際に処理することは可能ですか?

4

1 に答える 1