SQL插入语句中表名的别名

for*_*ran 13 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);
Run Code Online (Sandbox Code Playgroud)

进入这个:

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);
Run Code Online (Sandbox Code Playgroud)

(显然我的情况更长,涉及更多参考)

Mat*_*lie 11

您不对表进行别名,而是为表引用的实例添加别名.

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


在你的情况下,有两个显示停止...

插入表格到本身不是选择查询的一部分,它不是以同样的方式作为基准组foo,bar或者baz例如.所以,你根本不能对它进行别名(因为没有必要,它永远不会被引用).

此外,即使它是,您也不能通过别名引用整个表.您引用一个字段,作为通过集合进行迭代的查询的一部分.例如,这不起作用......

SELECT * FROM myTable AS xxx WHERE id = (SELECT MAX(id) FROM xxx)
Run Code Online (Sandbox Code Playgroud)

你可以使用...来解决后一个例子

WITH xxx AS (SELECT * FROM myTable) 
SELECT * FROM xx WHERE id = (SELECT MAX(id) FROM xxx)
Run Code Online (Sandbox Code Playgroud)

但是这仍然让我们回到第一点,插入的表永远不会在语句的查询部分中被引用.

我能想到的唯一方法就是创建一个视图......


Joh*_*Woo 7

我认为答案是肯定的.AS之后没有了tableName

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

参考

更新

AS子句从版本9.5开始成为PostgreSQL的一部分,但正如上面的@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)
Run Code Online (Sandbox Code Playgroud)