我的数据库中有3个表,分别称为Jobs,JobApplications和Candidates。
在这里。
工作
JobId | JobTitle --------------------------- 2115 | Software Engineer 2154 | Accountant 4562 | Sales Manager 4569 | Civil Engineer
JobApplications
JobApplicationId | CandidateId | JobId --------------------------- 8845 | 1120 | 2154 8912 | 1120 | 4569 9120 | 1555 | 2115 9450 | 1899 | 2115 9458 | 1991 | 4569 9488 | 1889 | 4569
候选人
CandidateId | Email ---------------------------- 1120 | can1@mail.com 1555 | can2@mail.com 1889 | can3@mail.com 1991 | can4@mail.com
我想要的是:一个基于候选人和工作编号的表,基于他们以前的应用程序。
例如:如果有人申请了“软件工程师”职位,那么我需要所有其他标题为“软件工程师”的职位,但申请职位和候选人ID除外。
有什么方法可以使用SQL来实现这一目标?
有人可以帮助我吗?
预期输出如下
CandidateId | Suggest_jobId ------------------------------ 1120 | 3565 1120 | 8956 1120 | 4565 1889 | 8965 1889 | 4568
因此,单个候选人可能有多个工作建议。
答案 0 :(得分:2)
我们可以使用简单的CTE
来完成工作
WITH cte AS
(
SELECT j.JobId,
j.JobTitle,
ja.CandidateId
FROM JobApplications ja
JOIN Jobs j ON j.JobId=ja.JobId
)
SELECT j.JobTitle,
c.CandidateId
FROM Jobs j
JOIN cte c ON j.JobTitle like CONCAT('%',c.JobTitle,'%') AND c.JobId!=j.JobId
答案 1 :(得分:0)
我为您提供了简单而基本的解决方案。我已经使用表功能首先拆分应用的作业。然后,我使用这些结果通过Sanal Sunny的脚本找到相似之处。
表函数创建脚本:
CREATE FUNCTION [dbo].[Tbl_Fn_Split](
@InputText VARCHAR(8000)
, @Delimiter VARCHAR(8000) = ' ' -- delimiter that separates items
) RETURNS @List TABLE (Result VARCHAR(8000))
BEGIN
DECLARE @aResult VARCHAR(8000)
WHILE CHARINDEX(@Delimiter,@InputText,0) <> 0
BEGIN
SELECT
@aResult=RTRIM(LTRIM(SUBSTRING(@InputText,1,CHARINDEX(@Delimiter,@InputText,0)-1))),
@InputText=RTRIM(LTRIM(SUBSTRING(@InputText,CHARINDEX(@Delimiter,@InputText,0)+LEN(@Delimiter),LEN(@InputText))))
IF LEN(@aResult) > 0
INSERT INTO @List SELECT @aResult
END
IF LEN(@InputText) > 0
INSERT INTO @List SELECT @InputText
RETURN
END
基于Sanal Sunny的答案的发现相似性脚本:
WITH cte AS
(
SELECT j.JobId,
j.JobTitle,
ja.CandidateId,
A.Result
FROM JobApplications ja
JOIN Jobs j ON j.JobId=ja.JobId
CROSS APPLY (SELECT * FROM DBO.[Tbl_Fn_Split](j.JobTitle,' ')) A
)
SELECT DISTINCT c.CandidateId
,j.JobId
,j.JobTitle
FROM Jobs j
JOIN cte c ON j.JobTitle LIKE '%'+c.Result+'%'AND c.JobId!=j.JobId