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想想他为什么要这么做。如果这听起来很粗鲁,我很抱歉。