Eze*_*r K 4 sql snowflake-cloud-data-platform
使用 Snowflake,有 2 个表,一个有很多列,另一个有几个列,尝试在它们的连接上选择 * ,出现以下错误:
SQL compilation error:duplicate column name
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我的连接列都在两个表中,可能可以使用带有列名的 select 而不是 *,但有没有办法避免这种情况?或者至少让查询从它获取的任何表动态推断列名称?
我很确定雪花会让您通过以下方式从两个以上桌子的两半中选择全部
SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b
ON a.x = b.x
Run Code Online (Sandbox Code Playgroud)
您将无法做的是间接引用 GROUP BY 中的列的名称,因此这不起作用
SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b
ON a.x = b.x
ORDER BY x
Run Code Online (Sandbox Code Playgroud)
即使有些数据库知道因为你有 JOIN ON ax = bx 只有一个 x,但雪花不会允许它(好吧,我上次尝试这个时没有)
但是您可以在上面使用别名或输出列位置,因此以下两者都可以工作。
SELECT a.*, b.*
FROM table_a AS a
JOIN table_b AS b
ON a.x = b.x
ORDER BY a.x
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
一般来说,*和a.*形式非常方便,但实际上对性能不利。
当选择时,如果已重新创建表,您现在可能会面临以不同顺序恢复列的风险,从而使读取代码不稳定。这也会影响视图。
这也意味着需要加载表的所有元数据才能知道数据的完整形式。如果您x,y,z只想将 aw添加到表中,则可以更快地编译整个查询计划。
最后,如果您在子选择中进行选择SELECT * FROM table并且仅需要这些列的子集,则执行编译器不需要修剪这些列。如果所有变量都附加到正确别名的表,如果稍后第二个表添加相同的命名列,则裸列稍后不会出现歧义。这只会在 SQL 运行时发生,这可能是一个“年度报告”,但不会经常发生。哇,使用别名真是太长了。
您可以在列名称前加上表名称作为前缀:
select table_a.id, table_b.name from table_a join table_b using (id)
Run Code Online (Sandbox Code Playgroud)
与 * 结合使用同样有效:
select table_a.id, table_b.* from table_a join table_b using (id)
Run Code Online (Sandbox Code Playgroud)
它也适用于语句的“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%'
Run Code Online (Sandbox Code Playgroud)
您可以使用表别名来进行语句排序:
select a.id, b.* from table_a a join table_b b
on a.id = b.id
Run Code Online (Sandbox Code Playgroud)
别名可以应用于子查询、客户端软件和(取决于 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
Run Code Online (Sandbox Code Playgroud)