我有一个名为hr_grades的表,其中包含员工工资等级,例如:
ID hr_grade
1 PR07
2 AC04
我运行两个存储过程。一个返回的员工的成绩在此表中,另一个不返回。这些存储过程执行许多不同的任务来准备要加载到最终系统中的数据。
我希望查询对成绩表中的行执行通配符搜索。因此,例如对于表中的成绩的员工
SELECT DISTINCT
Employee_ID,
FROM
@tmp_vo_hr_acp_staff v
INNER JOIN
hr_grades g ON v.hr_grade LIKE g.HR_Grade + '%' -- wildcard search
通配符的原因是hr_grades可以类似于AC04(1),AC04(2)等。
这很好。但是,我正在努力使这项工作反过来。
SELECT DISTINCT
Employee_ID,
FROM
@tmp_vo_hr_acp_staff v
INNER JOIN
hr_grades g ON v.hr_grade NOT LIKE g.HR_Grade + '%'
有什么想法可以使通配符搜索在不喜欢的条件下工作吗?
就像在SQL中一样,有一些方法可以做到:
-- 1. using outer join where the outer table don't match
SELECT DISTINCT Employee_ID
FROM @tmp_vo_hr_acp_staff v
LEFT JOIN hr_grades g ON (v.hr_grade LIKE g.HR_Grade + '%') -- wildcard search
WHERE g.id IS NULL -- use any non nullable column from hr_grades here
-- 2. using EXISTS for set difference
SELECT DISTINCT Employee_ID
FROM @tmp_vo_hr_acp_staff v
WHERE NOT EXISTS (
SELECT 'x' FROM hr_grades g WHERE v.hr_grade LIKE g.HR_Grade + '%'
)
-- 3. using the less popular ANY operator for set difference
SELECT DISTINCT Employee_ID
FROM @tmp_vo_hr_acp_staff v
WHERE NOT v.hr_grade LIKE ANY (
SELECT g.HR_Grade + '%' FROM hr_grades g
)
就我个人而言,我不喜欢使用联接进行过滤,因此我可能会使用选项2。但是,如果hr_grades
小于@tmp_vo_hr_acp_staff
,您可以从使用选项3中受益(因为该集合可以预先确定,并且可以使用a进行缓存)单读操作)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句