SQLite左连接查询结果不符:为何两段SQL返回不同结果?
SQLite左连接字段选取结果不一致的原因
我想在SQLite中选取部分字段并创建视图,但两段SQL代码返回结果不同,请问原因是什么?
两段对比代码
第一段代码(仅返回第一张表数据):
SELECT date, PCEDurableGoods FROM debtandsavings left join (select date, FedRate FROM rates) using (date);
第二段代码(返回完整连接结果):
SELECT * FROM debtandsavings left join rates using (date);
示例数据
debtandsavings表数据
date PCEDurableGoods 2022-09-01 6.612628882215829 2022-08-01 6.581442803985115 2022-07-01 6.573571833810114 2022-06-01 6.573321162184561 2022-05-01 6.50050461361015
rates表数据
date FedRate 2022-09-01 2.56 2022-08-01 2.33 2022-07-01 1.68 2022-06-01 1.21 2022-05-01 0.77
执行结果
第一段代码执行结果
date PCEDurableGoods 2022-09-01 6.612628882215829 2022-08-01 6.581442803985115 2022-07-01 6.573571833810114 2022-06-01 6.573321162184561 2022-05-01 6.50050461361015
第二段代码执行结果
date PCEDurableGoods FedRate 2022-09-01 6.61262888221583 2.56 2022-08-01 6.58144280398512 2.33 2022-07-01 6.57357183381011 1.68 2022-06-01 6.57332116218456 1.21 2022-05-01 6.50050461361015 0.77
原因分析
问题核心在于SELECT子句的字段范围:
- 第一段代码的
SELECT date, PCEDurableGoods只明确指定了debtandsavings表的两个字段,完全没有包含关联子查询中的FedRate字段。实际上左连接已经成功执行,但因为没指定要返回FedRate,结果集中自然不会显示该字段,看起来像是没实现连接。 - 第二段代码用
SELECT *会选取连接后结果集的所有字段,包括debtandsavings的字段和rates表的FedRate,因此能看到完整的连接结果。
如果要让第一段代码返回包含FedRate的结果,只需把该字段加入SELECT子句:
SELECT date, PCEDurableGoods, FedRate FROM debtandsavings left join (select date, FedRate FROM rates) using (date);
Python等效代码
out_df = pd.merge(df1[['date','PCEDurableGoods']], df2[['date','FedRate']], on='date', how='left')
内容的提问来源于stack exchange,提问作者tjaqu787
相关产品推荐
相关产品推荐

