在不使用HAVING的情况下,通过多对多关系过滤?

时间:2013-08-14 15:10:20

标签: sql having-clause

有没有办法编写一个参数化SQL查询,该查询匹配链接到多个项目的注释,而不使用 HAVING

SQLfiddle

假设我有一个“notes”表,一个“projects”表和一个将这两者连接在一起的“notes_projects”表。我想在 IN 子句中找到与所有项目ID相关联的注释。这是 HAVING

的版本
SELECT notes.*, COUNT(np.project_id) AS np_count
FROM notes
INNER JOIN notes_projects AS np
  ON np.note_id = notes.id
WHERE np.project_id IN (?)
GROUP BY notes.id
HAVING np_count = 2;

有没有办法不使用 HAVING 子句,或者这是处理此类案件的正确方法吗?

1 个答案:

答案 0 :(得分:0)

不要加入链接表,因为这会更改行数。使用EXISTS

制定查询
SELECT *
FROM notes n
WHERE EXISTS (
 SELECT *
 FROM notes_projects AS np
 WHERE np.note_id = notes.id AND np.project_id IN (?)
)

(您的查询中的分组就是为了解决连接引起的问题。)

这是一个需要找到所有项目的版本:

SELECT *
FROM notes n
WHERE NOT EXISTS (
 SELECT *
 FROM notes_projects AS np
 WHERE np.note_id = notes.id AND np.project_id NOT IN (?)
)