Access SQL查询WHERE子句AND/OR逻辑异常:无结果或条件失效
问题排查与修正
逻辑错误分析
你最初的WHERE子句写法直接导致逻辑偏离预期:
WHERE (((T_SALARIE_EMPLOI.SALARIE_EMPLOI_identifiant)=[Formulaires]![F_COMOB]![ACTION_identifiant_emploi]) AND ((T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*valid*")) OR (((T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*décidé*"));
这段代码的逻辑等价于 (A AND B) OR C,其中:
- A:
SALARIE_EMPLOI_identifiant匹配表单值 - B:
STATUT_EMPLOI_statut包含"valid" - C:
STATUT_EMPLOI_statut包含"décidé"
这意味着只要C成立,不管A是否满足都会返回结果,所以表单匹配的A条件相当于被忽略,这就是你看到该条件失效的核心原因。
分组后无结果的可能原因
你改写的分组语句逻辑是正确的(A AND (B OR C)),但无结果返回,大概率是以下情况导致:
- 数据本身不存在同时满足A且(B或C)的记录:可以单独执行
SELECT * FROM T_SALARIE_EMPLOI WHERE SALARIE_EMPLOI_identifiant=[Formulaires]![F_COMOB]![ACTION_identifiant_emploi],查看是否有匹配的记录,再检查这些记录对应的STATUT_EMPLOI_statut是否包含"valid"或"décidé" - 表单控件值异常:
[Formulaires]![F_COMOB]![ACTION_identifiant_emploi]可能为空,或者值与T_SALARIE_EMPLOI.SALARIE_EMPLOI_identifiant的类型不匹配(比如字段是数字类型,但表单传递了字符串) - 特殊字符匹配问题:"décidé"中的é可能与字段存储的字符编码不一致(比如字段里是无重音的"decide"),可以尝试用
Like "*decid*"去掉重音测试是否有结果 - 左连接的潜在影响:虽然查询未用到
R_Select_Salarie的字段,但如果T_SALARIE_EMPLOI中匹配A的记录在R_Select_Salarie中无对应项,左连接会保留这些记录,但如果结果为空,大概率不是这个原因,可尝试改成内连接验证
修正后的正确语句
确保逻辑严格遵循A AND (B OR C),也就是你改写的版本,结合上述排查步骤验证数据即可:
SELECT [SALARIE_nom] & " " & [SALARIE_prenom] & " (" & [SALARIE_NNI] & ")" AS Salarié, T_SALARIE_EMPLOI.SALARIE_EMPLOI_identifiant, T_STATUT_EMPLOI.STATUT_EMPLOI_statut FROM (T_STATUT_EMPLOI INNER JOIN T_SALARIE_EMPLOI ON T_STATUT_EMPLOI.STATUT_EMPLOI_id = T_SALARIE_EMPLOI.SALARIE_EMPLOI_statut_id) LEFT JOIN R_Select_Salarie ON T_SALARIE_EMPLOI.SALARIE_EMPLOI_salarie_nni = R_Select_Salarie.SALARIE_NNI WHERE T_SALARIE_EMPLOI.SALARIE_EMPLOI_identifiant=[Formulaires]![F_COMOB]![ACTION_identifiant_emploi] AND (T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*valid*" OR T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*décidé*");
内容的提问来源于stack exchange,提问作者Kais
相关产品推荐
相关产品推荐

