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)
....

非常感谢!

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

4

3 回答 3

4

通常强烈建议不要将其用于SELECT * FROM除临时查询之外的任何测试。

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

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

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

于 2013-08-02T02:09:55.063 回答
2

您可以使用自然连接

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

SELECT * FROM T1 NATURAL JOIN T2;

请查看此演示

但是请注意,这NATURAL JOIN是危险的,因此强烈建议不要使用它们。危险来自于无意中添加了一个新列,该列与另一个表中的另一个列命名相同。

于 2013-08-02T02:24:57.927 回答
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>;

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

于 2013-08-02T02:15:04.613 回答