You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AND与OR的区别及多表关联查询异常问题咨询

解决多表关联查询的AND/OR问题及逻辑区别

看起来你在多表关联查询时踩了个常见的坑,咱们一步步捋清楚问题出在哪,以及AND和OR到底在这种场景下怎么工作。

为什么你的AND条件没结果,OR却返回混乱的“随机值”?

先看你写的SQL结构:用逗号把所有表列出来,然后在WHERE里加连接条件。这种写法本质上是**内连接(INNER JOIN)**的老式语法,它要求所有连接条件必须同时满足才能返回结果。也就是说,只有当某个讲师在Participation、ScientificEvaluator、commision这三张表里都有对应的关联记录时,才会被筛选出来。如果有任何一张表没有这个讲师的记录,整个条件就不满足,自然没有返回结果。

而换成OR条件后,逻辑变成了“只要满足其中一个连接条件就行”,这会导致数据库做笛卡尔积:比如只要讲师在Participation里有记录,数据库会把这条讲师记录和ScientificEvaluator、commision里的所有记录做匹配,哪怕那些记录和这个讲师完全无关。结果就是你看到的“随机值”——其实是不匹配的字段被错误地拼接在一起了,根本不是正确的关联数据。

正确的查询写法:用LEFT JOIN保留所有讲师信息

因为你需要展示讲师的相关信息,不管其他表有没有对应记录,应该用左连接(LEFT JOIN),它会保留左表(Lecturer_info)的所有记录,其他表没有对应记录的字段会显示为NULL。修正后的SQL大概是这样(注意根据你的实际外键名调整):

SELECT 
    li.Lecturer_Name,
    c.com_name,
    se.Sicn_name,
    p.Names_Of_Participations,
    p.pdf1,
    p.pdf2,
    p.pdf3
FROM Lecturer_info li
LEFT JOIN Participation p ON li.Lecturer_id = p.lecturer_fk
LEFT JOIN ScientificEvaluator se ON li.Lecturer_id = se.lecturer_fk
LEFT JOIN commision c ON li.Lecturer_id = c.lecturer_fk
-- 若需筛选特定讲师,可在此添加WHERE条件,例如 WHERE li.Lecturer_Name = '张三'

注:你原语句里的com_id = part_id,如果是commision和Participation之间的关联逻辑,应该加到对应的JOIN条件里,而不是放在WHERE中,否则会变回内连接的筛选效果。

AND和OR的核心区别

  • AND逻辑:所有条件必须同时成立,相当于“并且”。在多表连接的WHERE条件里,它要求每条记录都满足所有连接条件,只有完全匹配的关联记录才会被保留。
  • OR逻辑:只要有任意一个条件成立,相当于“或者”。在多表连接中使用OR,会打破关联的唯一性,导致数据库把满足任一条件的记录全部组合起来,产生大量不匹配的笛卡尔积结果,这就是你看到“随机值”的原因。

简单说,AND是“严选”,只有全匹配的才留下;OR是“放宽准入”,但会把不相关的记录也混进来。

内容的提问来源于stack exchange,提问作者Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:30:43