SQL所有列除外

时间:2013-08-02 02:06:47

标签: mysql sql hive

我有两张桌子:

Table1 has columns A, B, C, D, E, F, G

Table2 has columns G, H, I, J, K, L, M, N

我想在G列上加入这两个表,但要避免重复列(模糊G)。 我必须像下面那样进行查询。

select 
 t1.*, 
 t2.H,
 t2.I,
 t2.J,
 t2.K,
 t2.L,
 t2.M,
 t2.N
from Table1 t1
inner join Table2 t2
on t1.G = t2.G

我已经使用t1。*来尝试避免在table1中键入每个列名称但是,我仍然必须输入加入列G的所有列EXCEPT,如果你有一个包含很多列的表,这是一个彻底的灾难列...

我们可以做一些方便的方式

select 
 t1.*
 t2.*(except G)
....

非常感谢!

我知道我可以打印出所有列名,然后复制并粘贴,但是,即使我不需要手动输入,查询仍然太长而无法调试....

3 个答案:

答案 0 :(得分:4)

通常强烈建议在除临时查询之外的任何事情中使用SELECT * FROM进行测试。

原因是表模式发生了变化,这可能会破坏假定存在某个列的代码或表中列的顺序。

即使它使您的查询时间很长,我也建议您在数据集中指定要返回的每一列。

但是,要回答你的问题,没有办法在SELECT子句中指定之外的每一列。

答案 1 :(得分:2)

您可以使用natural join

  

自然连接是一种等连接,其中出现连接谓词   隐式地通过比较两个表中具有相同列的所有列   连接表中的列名。生成的连接表包含   每对同名列只有一列。

SELECT * FROM T1 NATURAL JOIN T2;

请结帐this demo

但请注意,NATURAL JOIN是危险的,因此强烈反对使用它们。危险来自于无意中添加了一个新列,其名称与另一个表中的另一列相同。

答案 2 :(得分:1)

您无法自动执行此操作(使用动态SQL除外)。但是你可以通过查询信息表来节省很多精力。

您可以通过执行以下操作获取两个表中的列列表:

select distinct column_name
from information_schema.columns
where table_name in ('Table1', 'Table2') and
      table_schema = <schema name>;

您可以将此列表复制到SQL编辑器(或Excel)中以格式化查询。为了方便起见,您甚至可以这样做:

select group_concat(distinct concat(column_name, ', '))
from information_schema.columns
where table_name in ('Table1', 'Table2') and
      table_schema = <schema name>;

这会将所有列放在一行上,以列分隔。