SQL insert语句中表名的别名

SQL insert语句中表名的别名,sql,database,postgresql,alias,Sql,Database,Postgresql,Alias,是否可以为要插入值的表指定别名 我想在嵌套查询中指定一个条件,但该表太冗长 像这样的话: INSERT INTO my_table_with_a_very_long_name (col_a, col_b, col_c) SELECT foo, bar, baz FROM other_table WHERE other_table.some_value > (SELECT max(other_value) FROM my_table_with_a_very_long_name);

是否可以为要插入值的表指定别名

我想在嵌套查询中指定一个条件,但该表太冗长

像这样的话:

INSERT INTO my_table_with_a_very_long_name (col_a, col_b, col_c)
SELECT foo, bar, baz
FROM other_table
WHERE
  other_table.some_value > 
  (SELECT max(other_value) FROM my_table_with_a_very_long_name);
为此:

INSERT INTO my_table_with_a_very_long_name AS t (col_a, col_b, col_c)
SELECT foo, bar, baz
FROM other_table
WHERE
  other_table.some_value > (SELECT max(other_value) FROM t);

(显然我的案例更长,涉及的参考文献也更多)

我认为答案是
tableName之后没有
AS

INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

更新
AS
子句自年起成为PostgreSQL的一部分,但正如上面@MatBailie所指出的,嵌套意味着您需要分别为
INSERT
查询和
SELECT
子查询加上别名,否则一切都会中断。e、 g:

> CREATE TABLE foo (id int, name text);
CREATE TABLE
> INSERT INTO foo VALUES (1, 'alice'), (2, 'bob'), (3, 'claire');
INSERT 0 3
> INSERT INTO foo AS f (SELECT f.* from f);
ERROR:  relation "f" does not exist
LINE 1: INSERT INTO foo AS f (SELECT f.* from f);
                                              ^

-- Next line works, but is confusing. Pick distinct aliases in real life.
-- I chose the same 'f' to illustrate that the sub-select 
-- really is separate.
> INSERT INTO foo AS f (SELECT f.* from foo f); 
INSERT 0 3
> > SELECT * FROM foo;
 id |  name
----+--------
  1 | alice
  2 | bob
  3 | claire
  1 | alice
  2 | bob
  3 | claire
(6 rows)

您不是为表别名,而是为表引用的实例别名

这允许自连接等,因为您有对同一物理表的多个引用实例。不是每个
AS
在其他地方给该表起了一个新名称,它只是引用该特定引用的别名


在你的情况下,有两个节目停止

插入到中的表本身不是select查询的一部分,它不是一个引用集,其方式与
foo
bar
baz
等不同。因此,您根本无法对其进行别名(因为没有必要,它永远无法被引用)

此外,即使是,也不能通过别名引用整个表。引用字段,作为查询集的一部分。例如,这也不起作用

SELECT * FROM myTable AS xxx WHERE id = (SELECT MAX(id) FROM xxx)
您可以使用以下命令绕过后一个示例

WITH xxx AS (SELECT * FROM myTable) 
SELECT * FROM xx WHERE id = (SELECT MAX(id) FROM xxx)
但这仍然让我们回到第一点,插入到中的表永远不会在语句的查询部分被引用


我能想到的唯一办法是创建一个视图…

正如其他人所说,您不能在
INSERT INTO
语句中使用别名。您需要将它放在
WHERE
语句的子查询中

INSERT INTO my_table_with_a_very_long_name (col_a, col_b, col_c)
SELECT foo, bar, baz
FROM other_table
WHERE
  other_table.some_value > (SELECT max(other_value) FROM 
      my_table_with_a_very_long_name AS t);

不,但你为什么要这么做?只是美学?发布你的原始查询。可能有一些方法可以简化它。在这种情况下,抽象是没有用的。INSERT表本身上的别名将毫无意义,因为它无法被引用。但是同一个表可以在SELECT语句中引用,并且在那里有一个别名。事实上,这是一个动态查询,所以我只想在标题中替换一次表名,并用别名引用其余的表名。Aaron Bertrand曾经使用过这个类比。。。我认为这是一个完美的类比,所以我偷了它。当有人问你如何骑着牛上班时。。。第一个问题不应该是“如何?”。。。但是“为什么?”而且,否定是一个有效的答案我的回答不是要批评你。。我只是想让OP想想他为什么要这么做。如果这听起来很粗鲁,我很抱歉。