前提:A表关联B表,要求A表中符合条件的数据全部展示,B表中符合条件展示,不符合条件补空,简单来说就是一个left join,但是关联条件位置不同可能会影响筛选结果,代码如下:
--code1
SELECT A.GRADE,A.NAME,B.CLASS
FROM A
LEFT JOIN B
ON A.NAME = B.NAME
AND B.CLASS = '1'
WHERE A.GRADE = '6'
--code2
SELECT A.GRADE,A.NAME,B.CLASS
FROM A
LEFT JOIN B
ON A.NAME = B.NAME
WHERE A.GRADE = '6'
AND B.CLASS = '1'
上述两段sql代码分别把B表的限制条件放在了关联条件和WHERE条件中,区别在于: 前者在关联时,先用name字段与A表关联,如果有符合B.CLASS = '1’的数据,则展示相关B表信息,否则将B表相关信息补空; 后者在关联时,用name字段与A表关联,然后再对关联结果进行筛选,展示A.GRADE = ‘6’,同时满足B.CLASS = '1’的数据,若A.GRADE = ‘6’,但是B.CLASS <> ‘1’,则会被剔除,那么那些A表可以取到数据,B表不符合B.CLASS = '1’补空的数据就会丢失, 导致查询结果丢失部分数据。
综上,按照规范的查询格式,推荐code1筛选条件方式,即主表A筛选条件放在where中,关联副表条件放在关联条件中。 主表卡where,副表卡关联。