簡體   English   中英

SQL 服務器中具有多個限定過濾器的搜索引擎

[英]Search Engine with Multiple Qualification Filters in SQL Server

我正在嘗試建立一個像求職門戶網站那樣的搜索引擎。 我的查詢與資格特別相關。 我的最終用戶可以查詢具有單個或一組資格-學科組合的員工,或者他們可以提供具有學科的資格列表並詢問所有完成任何給定資格-學科組合的員工。 我的腳本如下。

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 的員工,他們有任何學科,也做過人力資源方面的 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

@ReqData有時可能帶有 50 到 60 行。 為此,我只能使用循環或存儲過程遞歸。 我有大約 50,000 名員工和大約 2,00,000 份資格證書,而且還在不斷增長。 因此,這種循環和遞歸使我的系統變慢。 有沒有更好更簡單的方法來解決這個問題? 實際上是否可以通過單個查詢來處理它?

我找到了一種無需循環或遞歸即可實現此目的的解決方案。 在下面發布解決方案。 謝謝大家的幫助。

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)
declare @CriteriaCnt int

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 2,2 union
select 6,3

select @CriteriaCnt = count(QualId) from @ReqData

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
begin
select em.* from @Emp em
inner join
(select h.Eid, count(h.QualId) Cnt from 
(select distinct q.Eid, f.QualId 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, f.QualId from @EmpQualification q
inner join (select distinct QualId from @ReqData where DispId = 'Any') f on q.QualId = f.QualId) h
group by h.Eid
having count(h.QualId) >= @CriteriaCnt) m on m.Eid = em.Eid
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM