【问题标题】:In SQL is there a way to use select * on a join?在 SQL 中有没有办法在连接上使用 select *?
【发布时间】:2021-11-29 22:14:59
【问题描述】:

使用 Snowflake,有 2 个表,一个有很多列,另一个有一些列,尝试在它们的连接上选择 *,得到以下错误:

SQL compilation error:duplicate column name

这是有道理的,因为我的连接列在两个表中,可能会使用带有列名而不是 * 的 select,但是有什么方法可以避免这种情况吗?或者至少让查询从它获得的任何表中动态推断列名?

【问题讨论】:

  • 其实对于大多数 SQL 引擎的 IIUC 来说,做一个顶级的SELECT * 是可以的,即使同一个列名出现了不止一次。它只会在查询内部出现问题。在任何情况下,您都必须列出要选择的所有列。我建议只在每个单独的表上运行 SELECT * 以找出列名是什么。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

我很确定雪花会让你从两个以上的表的两半中选择所有通过

SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b 
  ON a.x = b.x

你不能做的是间接引用 GROUP BY 中列的名称,因此这不起作用

SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b 
  ON a.x = b.x
ORDER BY x 

即使某些数据库知道因为您在 a.x = b.x 上加入了只有一个 x,但雪花不会允许它(好吧,我上次尝试时没有这样做)

但您可以使用上面的别名或输出列位置,因此以下两种方法都可以使用。

SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b 
  ON a.x = b.x
ORDER BY a.x
SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b 
  ON a.x = b.x
ORDER BY 1 -- assuming x is the first column

一般来说*a.* 形式非常方便,但实际上对性能不利。

现在选择时,如果表已重新创建,则可能会以不同的顺序返回列,从而使读取代码不稳定。这也会影响 VIEW。

这也意味着需要加载表的所有元数据才能知道数据的完整形式。如果您只需要x,y,z,然后将w添加到表中,则整个查询计划可以更快地编译。

最后,如果您在子选择中选择 SELECT * FROM table 并且只需要这些列的子集,则执行编译器不需要修剪这些列。如果所有变量都附加到一个正确别名的表,如果稍后第二个表添加了相同的命名列,那么裸列在以后不会模棱两可。仅在运行该 SQL 时才会发生,这可能是不经常发生的“年度报告”。哇,多长时间使用别名咆哮。

【讨论】:

    【解决方案2】:

    你可以在列名前加上表名:

    select table_a.id, table_b.name from table_a join table_b using (id)
    

    与 * 结合使用同样有效:

    select table_a.id, table_b.* from table_a join table_b using (id)
    

    它也适用于语句的“join”和“where”部分

    select table_a.id, table_b.* from table_a join table_b 
    on table_a.id = table_b.id where table_b.name LIKE 'b%'
    

    您可以使用表别名来制作语句排序器:

    select a.id, b.* from table_a a join table_b b 
    on a.id = b.id
    

    别名可以应用于要在子查询、客户端软件和(取决于 SQL 服务器)语句的其他部分中使用的字段,例如“order by”:

    select a.id as a_id, b.* from table_a a join table_b b 
    on a.id = b.id order by a_id
    

    【讨论】:

    • 是的,但是 OP 正在寻求某种方法来做到这一点,而不列出所有列名。很可能没有这样的方法。
    • 我添加了一个带有 table_b 的示例。*
    • 你的第二个不能解决 OP 的问题,对吧?您仍在选择两个具有相同名称的 id 列。
    • 老实说,我不太确定作者到底在问什么 :-) 如果我的回答有帮助,我希望他能告诉我们。
    • 它确实有帮助,因为我不知道使用 'table.*' 的选项
    【解决方案3】:

    如果您要的结果包括连接中每个表中所有不同的非连接列,而连接列仅包含在输出中一次(假设它们对于内部连接是相同的),您可以使用自然加入。

    例如 select * from d1 natural inner join d2 order by id;

    查看示例:https://docs.snowflake.com/en/sql-reference/constructs/join.html#examples

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2013-04-24
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2019-08-07
      • 2021-08-22
      相关资源
      最近更新 更多