对我来说,很难总结我想要进行的查询,所以也许举个例子会更清楚.

假设我有两个主表:

员工:

| employee_id | employee_name |
| ----------- | ------------- |
| 1           | Alice         |
| 2           | Bob           |
| 3           | Carol         |

编程语言(_L):

| language_id | language_name |
| ----------- | ------------- |
| 1           | Python        |
| 2           | C++           |
| 3           | JavaScript    |

第三个表包含前两个表中的外键,表示哪些员工知道哪些编程语言:

员工已知语言:

| employee_id | language_id |
| ----------- | ----------- |
| 1           | 1           |
| 2           | 1           |
| 2           | 2           |
| 2           | 3           |
| 3           | 3           |

因此,在本例中,Alice了解Python,Bob了解Python C++和JavaScript,而Carol了解JavaScript.

如果我想要编写一个查询来获取所有懂C++的员工,我知道我想要做什么:

SELECT employee_name from
    employees INNER JOIN programming_languages INNER JOIN employee_known_languages
WHERE language_name = C++

如果我想让所有了解C++and Python的员工参与进来,那该怎么办?或者,更广泛地说,是language_name值的某个任意子集?

理想情况下,我能够以这样一种方式编写这段代码:我可以编写一个接受一组参数并执行查询的Python函数,但我认为能够弄清楚SQL本身会有所帮助.

推荐答案

Use a CTE that returns an arbitrary subset of the values of language_name and filter the results of the joins of the 3 tables for these language_names only.
Then use aggregation and set the condition in the HAVING clause:

WITH cte(language_name) AS (VALUES ('C++'), ('Python'))
SELECT e.* 
FROM employees e
INNER JOIN employee_known_languages ep ON ep.employee_id = e.employee_id
INNER JOIN programming_languages p ON p.language_id = ep.language_id
WHERE p.language_name IN cte
GROUP BY e.employee_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM cte);

See the demo.

Sql相关问答推荐

SQL查询以创建手头的流动余额?

在数据分区内执行确定

基于时间的SQL聚合

Postgres JSONB对象筛选

替换条件中的单元格值

Access VBA SQL命令INSERT FOR MULTIME VALUE

IF NOT EXISTS子查询的性能瓶颈

聚合内部的条件在哪里?

MySQL中的递归查询邻接表深度优先?

如何在Hive SQL中分别按多列进行分组?

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

PostgreSQL - 递归地聚合来自不同列的属性

函数调用作为插入值语句中的参数

强制 SQL 始终通过 R 从视图中返回至少一行

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

在 postgresql 中保存带有时间戳的几何类型数据

根据开始/结束标记将 GROUP_ID 分配给行

SQL 中的问题与包含最大日期的记录连接

是否有验证 SQL 连接的基数?