如何在SQL中删除与临时表JOIN后产生的重复冗余列?
出现重复gene_id列的核心原因是SELECT *会返回JOIN两侧两个表的所有字段,而你的业务表和临时表都包含gene_id字段,数据库会自动为重复字段添加后缀区分,就出现了内容完全一致的两列gene_id和gene_id_1,你可以用以下三种方法解决:
- 方案1:手动指定需要的查询列(兼容性最高,推荐优先使用)
不用SELECT *,按需列出你最终需要的字段即可:
WITH tempID AS ( SELECT DISTINCT transcript_id, gene_id FROM `lab-stuff.rna_seq.RN6` ) SELECT data_111.gene_id, data_111.gene_name, data_111.FPKM, data_111.TPM, tempID.transcript_id FROM `lab-stuff.rna_seq.1_1_1` AS data_111 RIGHT JOIN tempID ON data_111.gene_id = tempID.gene_id ORDER BY TPM DESC
- 方案2:用
USING替代ON写关联条件(适用于关联字段名完全相同的场景)
如果两个表的关联字段名完全一致,可以用USING替换ON,数据库会自动合并重复的关联字段,即使写SELECT *也不会出现重复列:
WITH tempID AS ( SELECT DISTINCT transcript_id, gene_id FROM `lab-stuff.rna_seq.RN6` ) SELECT * FROM `lab-stuff.rna_seq.1_1_1` AS data_111 RIGHT JOIN tempID USING(gene_id) ORDER BY TPM DESC
- 方案3:用列排除语法直接删除多余列(适用于支持该语法的SQL引擎,如BigQuery、Snowflake等)
如果你不想手动写所有字段,可以直接用EXCEPT语法排除多余的重复列:
WITH tempID AS ( SELECT DISTINCT transcript_id, gene_id FROM `lab-stuff.rna_seq.RN6` ) SELECT * EXCEPT(gene_id_1) FROM `lab-stuff.rna_seq.1_1_1` AS data_111 RIGHT JOIN tempID ON data_111.gene_id = tempID.gene_id ORDER BY TPM DESC
内容的提问来源于stack exchange,提问作者Luca Salerno
相关产品推荐
相关产品推荐

