Sql 重用相关子查询的结果

Sql 重用相关子查询的结果,sql,sqlite,query-optimization,correlated-subquery,Sql,Sqlite,Query Optimization,Correlated Subquery,我有一个表media_tags,其中包含两列,将媒体链接到用户定义的标记。我想做一些查询,选择标签上条件复杂的介质。我当前的解决方案是多次使用相同的相关子查询 多个SO答案将我指向CTE,但据我所知,这些答案只能用于替换不相关的子查询 选择outer.media\u id 从媒体_标记为外部 其中1在“从媒体标签中选择标签id作为内部”,其中outer.media\u id=inner.media\u id 和2不在“从媒体标签中选择标签id作为内部”,其中outer.media\u id=in

我有一个表media_tags,其中包含两列,将媒体链接到用户定义的标记。我想做一些查询,选择标签上条件复杂的介质。我当前的解决方案是多次使用相同的相关子查询

多个SO答案将我指向CTE,但据我所知,这些答案只能用于替换不相关的子查询

选择outer.media\u id 从媒体_标记为外部 其中1在“从媒体标签中选择标签id作为内部”,其中outer.media\u id=inner.media\u id 和2不在“从媒体标签中选择标签id作为内部”,其中outer.media\u id=inner.media\u id 和3中,从媒体标签中选择标签id作为内部,其中outer.media\u id=inner.media\u id 或在“从媒体标签中选择标签id作为内部”,其中outer.media\u id=inner.media\u id; 使用“不存在”如何

使用“不存在”如何

您可以按媒体id进行自加入、分组,并在HAVING子句中设置条件:

如果这也有效,则更简单,无需自连接检查:

SELECT media_id
FROM media_tags
GROUP BY media_id
HAVING 
  SUM(tag_id = 1) > 0
  AND
  SUM(tag_id = 2) = 0
  AND
  SUM(tag_id IN (3, 4)) > 0
您可以按媒体id进行自加入、分组,并在HAVING子句中设置条件:

如果这也有效,则更简单,无需自连接检查:

SELECT media_id
FROM media_tags
GROUP BY media_id
HAVING 
  SUM(tag_id = 1) > 0
  AND
  SUM(tag_id = 2) = 0
  AND
  SUM(tag_id IN (3, 4)) > 0

我看不到一种方法可以用于复杂的查询,如tag_1和NOT tag_2和tag_3或tag_4;我看不到一种方法可以用于复杂的查询,如tag_1和NOT tag_2和tag_3或tag_4
SELECT media_id
FROM media_tags
GROUP BY media_id
HAVING 
  SUM(tag_id = 1) > 0
  AND
  SUM(tag_id = 2) = 0
  AND
  SUM(tag_id IN (3, 4)) > 0