【问题标题】:SQL all columns exceptSQL 所有列,除了
【发布时间】:2013-08-02 02:06:47
【问题描述】:

我有两张桌子:

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

非常感谢!

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

【问题讨论】:

    标签: mysql sql hive


    【解决方案1】:

    通常强烈建议在临时查询以外的任何地方使用SELECT * FROM 进行测试。

    原因是表架构发生变化,这可能会破坏假定存在特定列或表中列顺序的代码。

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

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

    【讨论】:

    • 嗯,很高兴知道这一点。在 Hive 中,您总是在处理一个包含许多列的表,这真是一场灾难,迫使我问这个在 mysql 中是可以容忍的问题。
    【解决方案2】:

    您可以使用natural join

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

    SELECT * FROM T1 NATURAL JOIN T2;
    

    请查看this demo

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

    【讨论】:

    • 您方便地省略了链接文章的这一部分:Most experts agree that NATURAL JOINs are dangerous and therefore strongly discourage their use. The danger comes from inadvertently adding a new column, named the same as another column in the other table.
    • @MikeChristensen 感谢您的评论,是的,但这是 OP 所要求的:在 Hive 中,您总是在处理一个包含许多列的表,这是一场灾难,迫使我问这个问题在mysql中是可以容忍的。
    • NATURAL JOIN 确实节省了大量时间,但是,连接列的名称并不总是相同。但是,您可以更改表以强制它们具有相同的名称,这可能比包含数百行代码的连接查询更容易。
    【解决方案3】:

    您不能自动执行此操作(使用动态 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>;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多