根据员工工号和公司代码查询合同信息SQL语句
根据题目要求,可以使用以下SQL语句满足条件:
SELECT Id, WorkId, Name, ContractNo, ContractType, ContractTime, IsSyq, SyqSDate,
SyqEDatte, ContractSDate, ContractEDate, DataStatus, IsDeleted, CUser,
CDate, LUser, LDate, SyqMonth, ZZDate, CompanyCode, ContDesc, COptType,
SignCompanyCode, TermMode, ContractTimeMonth, Remark, Mark
FROM hrbase_mark_contract
WHERE WorkId = #{work_id}
ORDER BY CASE
WHEN (SELECT COUNT(DISTINCT CompanyCode) FROM hrbase_mark_contract WHERE WorkId = #{work_id}) = 1
THEN Id
WHEN #{company_code} IN (SELECT DISTINCT CompanyCode FROM hrbase_mark_contract WHERE WorkId = #{work_id})
THEN CASE
WHEN EXISTS (SELECT 1 FROM hrbase_mark_contract WHERE WorkId = #{work_id} AND CompanyCode <> #{company_code})
THEN (
SELECT MIN(Id)
FROM (
SELECT Id
FROM hrbase_mark_contract
WHERE WorkId = #{work_id} AND CompanyCode = #{company_code}
UNION
SELECT Id
FROM hrbase_mark_contract
WHERE WorkId = #{work_id} AND CompanyCode <> #{company_code}
) AS subquery
WHERE Id > (
SELECT MAX(Id)
FROM hrbase_mark_contract
WHERE WorkId = #{work_id} AND CompanyCode = #{company_code}
)
)
ELSE (
SELECT MIN(Id)
FROM hrbase_mark_contract
WHERE WorkId = #{work_id} AND CompanyCode = #{company_code}
)
END
ELSE Id
END ASC
这段SQL语句的逻辑如下:
- 首先根据工号(work_id)筛选出所有符合条件的合同数据;
- 接着根据不同的查询情况使用
ORDER BY CASE进行排序:- 如果只查出一条数据,则直接按照id升序排列;
- 如果查询出多条数据且所有数据的
company_code相同,则按照id升序排列; - 如果查询出多条数据且
company_code不完全相同,则首先判断传入的company_code是否在查询结果中,并且存在其他不同的company_code;- 如果存在,则在查询结果中筛选出
company_code相同的数据,并取其中id最小的一条数据; - 如果不存在,则按照id升序排列。
- 如果存在,则在查询结果中筛选出
请根据实际情况将#{work_id}和#{company_code}替换为实际的参数占位符。
原文地址: https://www.cveoy.top/t/topic/CoU 著作权归作者所有。请勿转载和采集!