SQL执行INNER JOIN内连接后如何正确选取指定列
问题背景
在通过指定列对两个DataFrame完成INNER JOIN内连接操作后,需要从连接生成的结果表中选取特定列,尝试执行如下SQL语句时触发报错:
SELECT * FROM land_birds INNER JOIN sea_birds ON land_birds.colour = sea_birds.colour SELECT colour, beak, size, weight FROM TABLE
返回的报错信息:
near "SELECT": syntax error
错误原因
- 语句被拆成了两个完全独立的SELECT查询,数据库按顺序执行完第一个JOIN查询后,直接遇到第二个无上下文的SELECT关键字,直接触发语法错误
- 第二个查询中写的
TABLE是SQL保留关键字,并不是前一段JOIN生成的结果集,即使语法校验通过也无法读取到目标数据
正确实现方案
方案1:直接在JOIN语句中指定目标列(性能最优)
不需要拆分查询语句,直接在JOIN查询的SELECT子句中声明需要提取的字段即可。注意两个表共有的同名字段(比如作为关联键的colour列),需要加上表名前缀明确字段来源,避免列名歧义。
SELECT land_birds.colour, land_birds.beak, land_birds.size, sea_birds.weight -- 根据字段实际所属表调整表名前缀即可 FROM land_birds INNER JOIN sea_birds ON land_birds.colour = sea_birds.colour
方案2:子查询写法(匹配先JOIN后选列的书写习惯)
如果想保留「先完成JOIN逻辑、再从结果里选列」的书写顺序,可以把JOIN查询作为子查询(派生表)包裹起来,给派生表起别名后再做列筛选:
SELECT colour, beak, size, weight FROM ( -- 内连接逻辑作为子查询 SELECT * FROM land_birds INNER JOIN sea_birds ON land_birds.colour = sea_birds.colour ) AS bird_join_res -- 给JOIN生成的派生结果起别名
方案3:pandas原生DataFrame写法
如果你是直接用pandas做数据处理而非走SQL查询,内连接后筛选列的参考代码如下:
import pandas as pd # 内连接后直接筛选目标列 join_res = pd.merge( left=land_birds, right=sea_birds, on="colour", # 关联字段名在两个表中一致时可直接用on参数 how="inner" )[["colour", "beak", "size", "weight"]]
如果两个表存在除关联键外的其他同名字段,merge时可通过suffixes参数给两个表的同名字段加自定义后缀区分,筛选列时对应写完整列名即可。
内容的提问来源于stack exchange,提问作者tesla john
相关产品推荐
相关产品推荐

