考虑到具有以下模式的表,我正在尝试创建一个动态查询,该查询接受具有多个变量的逻辑表达式,这样我就可以筛选只具有特定技术或类别名称的具有技能的员工。
例如,我正在输入伪表达式(technology = 'aws cognito' OR technology = 'azure active directory') AND category = 'framework'
,所以我知道前两个变量是技术,最后一个是技术类别。
考虑到变量的数量可能不同,并且总体上表达式可能是多级的,可能的查询会是什么样子?生成查询的方式是另一个问题,但我对它的实际结构有问题
我尝试过查询一个非常简单的案例(模式名称为skills(:
SELECT *
FROM "skills"."employees" "e"
LEFT JOIN "skills"."skills" "s" ON "s"."employee_id"="e"."id"
LEFT JOIN "skills"."technologies" "t" ON "t"."id"="s"."technology_id"
WHERE ("t"."name" = 'aws cognito'
AND "t"."name" = 'azure active directory')
但是,该查询不返回任何条目,但我的数据库中有员工,他们具有技能并使用这两种技术。所以我认为该查询会返回他们。它与OR运算符一起工作,但这是意料之中的事。我有一种非常糟糕的感觉,我做了一些根本错误的事情,但说实话,我就是无法理解
更新:样本数据
员工
id first_name
1 Andrew
2 James
技术
id name
1 aws cognito
2 azure active directory
技能
id employee_id technology_id
1 1 1
2 1 2
3 2 1
根据数据和逻辑表达式technology = 'aws cognito' AND technology = 'azure active directory'
,我希望结果只是id为1的员工(Andrew(。
对于任意一组需要的技能,您可以使用分组和计数方法
with skillset(tname) as(
values
('aws cognito'),
('azure active directory')
)
SELECT e.id, e.first_name
FROM "skills"."employees" e
JOIN "skills"."skills" s ON s.employee_id=e.id
JOIN "skills"."technologies" t ON t.id=s.technology_id
JOIN skillset st ON t.name = st.tname
GROUP BY e.id, e.first_name
HAVING count(*) = (select count(*) from skillset)