是否可以为我要插入值的表指定别名?
我想在嵌套查询中指定一个条件,表格太冗长了......
像转这样:
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);
(显然我的案子更长,涉及更多参考)
您没有别名表,您为表引用的实例添加别名。
这允许自连接等,因为您具有对同一物理表的引用的多个实例。这不是每个人的情况 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)
但是这仍然让我们回到第一点,插入的表永远不会在语句的查询部分中被引用。
我能想到的唯一方法是创建一个视图......
我认为答案是 没有。没有 AS
之后 tableName
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
参考
更新
该 AS
子句成为PostgreSQL的一部分 版本9.5虽然正如@MatBailie上面所说,嵌套意味着你需要别名 INSERT
查询和 SELECT
单独的子查询或事情将中断。例如。:
> 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)
正如其他人所说,你不能将名称别名作为其中的一部分 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);