PostgreSQL:如何基于关联test_run表行过滤test_result表数据?
问题解决:关联test_run特定行的test_result查询
数组方式的语法修正
你报错的原因是:WITH子句定义的test_runs是一张临时表,而非单个列,直接用ANY(test_runs)会被数据库识别为列名,自然找不到。需要给数组列指定别名,再正确引用这个列:
正确写法1:子查询引用数组列
WITH test_runs AS ( SELECT array(SELECT id FROM test_run) AS run_ids -- 给数组列命名为run_ids ) SELECT * FROM test_result WHERE test_run_id = ANY((SELECT run_ids FROM test_runs));
正确写法2:JOIN关联临时表
WITH test_runs AS ( SELECT array(SELECT id FROM test_run) AS run_ids ) SELECT tr.* FROM test_result tr JOIN test_runs ON tr.test_run_id = ANY(test_runs.run_ids);
更高效的替代方案(无需数组)
实际业务中,直接用IN子查询或JOIN是更常规、性能更优的选择(数据库对这类语句有成熟的查询优化策略,能更好利用索引):
方案1:IN子查询
SELECT * FROM test_result WHERE test_run_id IN (SELECT id FROM test_run);
方案2:JOIN关联(适合需要同时查询test_run表字段的场景)
SELECT tr.* FROM test_result tr JOIN test_run t ON tr.test_run_id = t.id;
注:如果只需筛选关联特定行(比如test_run满足某些条件),只需在子查询或JOIN的test_run表后加WHERE条件即可,例如:
SELECT id FROM test_run WHERE status = 'completed'
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

