SQLite中查询两表数据差异是否必须用JOIN子句?求实现方案
问题:提取Table 2中独有的Person记录
需要找出两张表中人员ID的差异,获取Table 2中独有的Person记录(即人员ID为5的条目)。原本计划使用OUTER JOIN,但不确定是否为最优方案,想知道用JOIN子句的简洁实现方式;若JOIN不合适,最优的简洁方法是什么?
尝试的代码:
SELECT Person, Package ID, Date from table1, table2 OUTER JOIN Person.table1 = Person.table2 Group by Date Order by Person;
样本数据
Table 1
| 人员 | 包裹ID | 日期 |
|---|---|---|
| 1 | Y788 | 01-01-2020 |
| 2 | T932 | 01-02-2020 |
| 3 | W345 | 01-03-2020 |
| 3 | S122 | 01-03-2020 |
| 4 | F567 | 01-04-2020 |
| 4 | H767 | 01-04-2020 |
Table 2
| 人员 | 包裹ID | 日期 |
|---|---|---|
| 1 | Y788 | 01-01-2020 |
| 2 | T932 | 01-02-2020 |
| 3 | W345, S122 | 01-03-2020 |
| 4 | F567, H767 | 01-04-2020 |
| 5 | C555 | 01-05-2020 |
期望结果
| 人员 | 包裹ID | 日期 |
|---|---|---|
| 5 | C555 | 01-05-2020 |
解决方案
一、用LEFT JOIN实现
可以通过LEFT JOIN关联两张表,筛选出Table2中在Table1无匹配的记录:
SELECT t2.人员, t2.包裹ID, t2.日期 FROM Table2 t2 LEFT JOIN Table1 t1 ON t2.人员 = t1.人员 WHERE t1.人员 IS NULL;
逻辑:LEFT JOIN会保留Table2的所有记录,匹配Table1中相同人员ID的条目;当Table1无对应记录时,t1的字段会为NULL,通过WHERE t1.人员 IS NULL即可筛选出Table2独有的人员记录。
二、用NOT EXISTS实现(更简洁高效)
如果仅关注人员ID的唯一性,NOT EXISTS逻辑更直观,且在人员ID有索引的情况下性能更优:
SELECT 人员, 包裹ID, 日期 FROM Table2 t2 WHERE NOT EXISTS ( SELECT 1 FROM Table1 t1 WHERE t1.人员 = t2.人员 );
逻辑:检查Table2的每条记录,若在Table1中找不到相同人员ID的条目,就保留这条记录。
三、原代码的问题纠正
你的尝试代码存在语法错误:
- 不能同时用逗号分隔表和OUTER JOIN,语法逻辑混乱;
OUTER JOIN需要明确是LEFT/RIGHT/FULL类型,关联条件必须写在ON子句中;- 含空格的字段名(如
Package ID)需要用引号或方括号包裹(例如[Package ID],不同数据库语法略有差异); - 不必要的
GROUP BY Date会导致数据聚合,不符合需求。
内容的提问来源于stack exchange,提问作者mq19745422
相关产品推荐
相关产品推荐

