问题 SQL插入语句中表名的别名


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

我想在嵌套查询中指定一个条件,表格太冗长了......

像转这样:

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);

(显然我的案子更长,涉及更多参考)


11730
2018-02-01 16:58


起源

不,但你为什么要这样做呢?只是美学? - sam yi
发布您的原始查询。可能有简化它的方法。抽象对于这种情况没有用。 INSERT表本身的别名没有意义,因为它无法引用。但是同一个表可以在SELECT语句中引用并在那里有别名。 - Erwin Brandstetter
实际上它是一个动态查询,所以我想在标题中只替换一次表名,并通过别名引用其余的名称。 - fortran
Aaron Bertrand曾经用过这个类比......我认为这是一个完美的类比,我偷了它。当有人问你如何骑牛去上班时......第一个问题不应该是“如何?”......但“为什么?”而且,NO是一个有效的答案。 ;)我的回答并不是一个关键的问题。我只是要求OP考虑他为什么要这样做。如果那听起来粗鲁,我道歉。 - sam yi


答案:


您没有别名表,您为表引用的实例添加别名。

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


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

插入的表本身不是select查询的一部分,它不是以与引用相同的方式引用的 foobar 要么 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)

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

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


9
2018-02-01 17:15





我认为答案是 没有。没有 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)

6
2018-02-01 17:06





正如其他人所说,你不能将名称别名作为其中的一部分 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);

0
2018-03-21 19:37