如何基于具有多个参数的逻辑表达式查询多对多关系



考虑到具有以下模式的表,我正在尝试创建一个动态查询,该查询接受具有多个变量的逻辑表达式,这样我就可以筛选只具有特定技术类别名称的具有技能的员工。

例如,我正在输入伪表达式(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)

最新更新