【问题标题】:Where clause based on another query in SQL Server基于 SQL Server 中另一个查询的 Where 子句
【发布时间】:2018-11-16 19:34:41
【问题描述】:

我的数据库中有 3 个表,分别称为 Jobs、JobApplications、Candidates。

他们来了。

工作

职位 ID |职称 -------------------------- 2115 |软件工程师 第2154章会计 4562 |销售经理 4569 |土木工程师

工作申请

职位申请ID |候选人ID |作业编号 -------------------------- 8845 | 1120 | 2154 8912 | 1120 | 4569 9120 |第1555章2115 9450 | 1899 | 2115 9458 | 1991 | 4569 9488 | 1889 | 4569

候选人

候选人ID |电子邮件 ---------------------------- 1120 | can1@mail.com 第1555章can2@mail.com 1889 | can3@mail.com 1991 | can4@mail.com

我想要的:一个包含候选人和 jobId 的表格,基于他们以前的申请。
例如:如果有人申请了“软件工程师”职位,我需要除了应聘职位之外的所有其他职位,标题为“软件工程师”,以及候选人 ID。

有没有办法使用 SQL 来实现这一点?

谁能帮帮我?

预期的输出如下所示

候选人ID | Suggest_jobId ------------------------------ 1120 | 3565 1120 | 8956 1120 | 4565 1889 | 8965 1889 | 4568

所以单个候选人可能有多个工作建议。

【问题讨论】:

  • 如果有人申请了“软件工程师”的职位,我需要所有其他标题为“软件工程师”的职位不明白这个逻辑,请你详细说明
  • 我需要通过职位名称获取与之前职位匹配的所有职位。基本上我需要根据候选人之前的申请向他们推荐新职位
  • 你能提供一个你想要的结果的例子吗?
  • 以前的申请存储在 JobApplications 下,新的工作存储在 Jobs 下

标签: sql sql-server tsql


【解决方案1】:

我们可以使用一个简单的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

【讨论】:

  • 谢谢!这个答案很好。如果没有确切的职位匹配,我们可以得到这个吗?例如。如果有人申请了“软件工程师”,他应该得到职位建议,如“高级软件工程师”、“Java 软件工程师”、“UI/UX 软件工程师”。
【解决方案2】:

我为您准备了简单而基本的解决方案。我首先使用表函数来拆分申请的工作。然后我使用这些结果使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2023-03-13
    • 2021-08-06
    相关资源
    最近更新 更多