event与review表关联OR条件查询结果与分开执行不一致问题
问题原因
- 核心问题是所有查询都缺失了
event表和review表的必要关联条件:题目明确说明eid与event字段含义等价,也就是每一条review记录都对应一个特定的event,你当前的写法直接对两张表做笛卡尔积,会生成大量跨event的无效匹配行。 - 分开执行q1、q2时,因为你的测试数据中跨表匹配的行刚好没有命中过滤条件,所以结果碰巧符合预期;但合并为OR条件的单查询后,跨表行命中OR条件的概率大幅升高,导致大量不符合需求的event被错误保留,最终结果出错。
- 额外补充:你当前用笛卡尔积+distinct的写法性能很差,尤其在表数据量较大的情况下会产生大量无效计算。
修正方案
方案1:用EXISTS做存在性判断(最推荐,逻辑清晰性能最优)
直接判断每个event是否存在至少一条属于自己的review满足任意一个条件,避免生成全量笛卡尔积:
SELECT DISTINCT eid, title FROM event e WHERE EXISTS ( SELECT 1 FROM review r WHERE e.eid = r.event -- 补全event和review的关联条件 AND (r.user = e.organizer OR e.startdate > r.reviewdate) );
方案2:用UNION合并两个查询结果(和你原来分开执行的逻辑完全一致)
如果你需要完全对齐之前分开查询的逻辑,直接用UNION合并两个结果集即可,UNION自带去重能力:
SELECT eid, title FROM ( SELECT DISTINCT eid, title FROM event e JOIN review r ON e.eid = r.event WHERE r.user = e.organizer UNION SELECT DISTINCT eid, title FROM event e JOIN review r ON e.eid = r.event WHERE e.startdate > r.reviewdate ) t;
方案3:补全关联条件后用OR查询(适合小数据量场景)
如果你的表数据量不大,也可以补全关联条件后直接用OR查询:
SELECT DISTINCT e.eid, e.title FROM event e JOIN review r ON e.eid = r.event WHERE r.user = e.organizer OR e.startdate > r.reviewdate;
内容的提问来源于stack exchange,提问作者user1390517
相关产品推荐
相关产品推荐

