SQL除了所有列之外的所有列

3

我有两个表:

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 之外的所有列名,如果表格有很多列,则会非常麻烦...是否有一种方便的方法可以做到这一点?
select 
 t1.*
 t2.*(except G)
....

非常感谢!

我知道我可以打印出所有的列名,然后复制粘贴,但是,即使我不必手动输入,查询仍然太长以至于很难调试...

3个回答

4
通常情况下,除了用于测试的即兴查询外,强烈不建议使用SELECT * FROM。原因在于表结构会发生变化,这可能会破坏代码,使其假定某个列存在或表中列的顺序。即使查询变得很长,我建议您在数据集中指定每个要返回的列。然而,回答您的问题,没有办法在SELECT子句中指定除一个之外的所有列

那很好知道。在Hive中,你总是在处理一个有许多列的表格,这是一场灾难,迫使我提出这个问题,在mysql中还能容忍。 - B.Mr.W.

2
您可以使用自然连接(natural join):
自然连接是一种等值连接,其中连接谓词通过比较加入表中具有相同列名称的两个表中的所有列而隐式产生。所得到的连接表仅包含每对同名列的一个列
SELECT * FROM T1 NATURAL JOIN T2;

请查看此演示
请注意,NATURAL JOIN是危险的,因此强烈反对使用它们。危险在于意外添加一个新列,该列与另一个表中的另一列同名。

1
你方便地省略了链接文章中的这一部分:“大多数专家都认为自然连接是危险的,因此强烈反对它们的使用。危险在于无意中添加一个新列,与另一个表中的另一列同名。” - Mike Christensen
@MikeChristensen 感谢您的评论,是的,但这就是 OP 所要求的:在 Hive 中,您总是处理一个有许多列的表格,这是一场灾难,迫使我提出这个问题,在 mysql 中是可以容忍的。 - Yang
自然连接确实可以节省很多时间,但是连接列的名称并不总是相同的。不过,您可以通过修改表来强制它们具有相同的名称,这可能比包含数百行代码的连接查询更容易。 - B.Mr.W.

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>;

这将所有列放在一行上,由分隔符分开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接