繁体   English   中英

Where子句基于SQL Server中的另一个查询

[英]Where clause based on another query in SQL Server

我的数据库中有3个表,名为Jobs,JobApplications,Candidates。

他们来了。

工作

JobId  | JobTitle
    ---------------------------
    2115   | Software Engineer
    2154   | Accountant
    4562   | Sales Manager
    4569   | Civil Engineer

工作申请

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

我想要的:一个基于候选人和jobIds的表格,基于他们以前的应用程序。
例如:如果有人申请了“软件工程师”工作职位,我需要所有其他工作,标题为“软件工程师”,除了将应用的工作与candidateId一起应用到表中。

有没有办法用SQL实现这个目的?

有谁能够帮助我?

预期的产出如下

CandidateId | Suggest_jobId
    ------------------------------
    1120        | 3565
    1120        | 8956
    1120        | 4565
    1889        | 8965
    1889        | 4568

因此,单个候选人可能有多个工作建议。

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

我有简单而基本的解决方案。 我已经使用表函数来首先拆分应用的作业。 然后我使用这些结果使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM