我有两个表用于两个不同的程序。每个程序都有一个特定的program_instance(program_instance)是程序的年份。
一张表称为“登记者”,另一张表称为“提名”——用于两个在技术上不相关的项目。
我一直在尝试从两张桌子上获取过去参与者的数量。以供参考:
程序实例 ID:
- 5 = GC 2014
- 3 = GC 2013
- 1 = GC 2012
- 4 = 通用电气 2013
- 2 = 通用电气 2012
所以我在我的登记表上运行了这个查询,它在 913 毫秒内产生了一个结果:
SELECT count(*) AS prev_enrollees
FROM outreach.enrollees e1
WHERE e1.program_instance_id = 5 AND EXISTS
(SELECT * FROM outreach.enrollees e2
WHERE e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.address1 = e2.address1
AND e1.state = e2.state
AND e1.zip = e2.zip
AND e2.program_instance_id < 5);
据我了解,此查询将为我提供“enrollees”表中的行数,其中当前年份的登记者 (program_instance_id = 5) 之前已在另一年登记。据我了解,它产生的结果非常准确。
所以...我在我的“提名”表上运行了这个 EXACT 查询(更改表名)。提名表具有几乎与“登记者”表完全相同的结构(有些列不同,但人员的信息字段相同)。在我取消之前,这个查询运行了半个多小时。它不会像在登记表上那样弹出几乎即时的结果,我不知道为什么需要更长的时间。
我可以想象如果表中有更多的行,但登记者表的行数比提名表多 50k。
我也试过:
SELECT count(*) AS prev_enrollees
FROM outreach_grow_education.nominations e1
JOIN outreach_grow_education.nominations e2 ON e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.address1 = e2.address1
AND e1.state = e2.state
AND e1.zip = e2.zip
AND 4 = e2.program_instance_id
WHERE e1.id IS NOT NULL AND e1.program_instance_id = 2;
唉,同样的结果。登记者的即时结果,提名永无止境。
对于我试图实现的目标,是否有其他选择不会导致永无止境的循环?