SQL插入语句中表名的别名

时间:2012-02-01 16:58:58

标签: 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 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);

(显然我的情况较长,并且涉及更多参考资料)

3 个答案:

答案 0 :(得分:11)

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

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


在你的情况下,有两个show stoppers ......

正在插入的表本身不是选择查询的一部分,它不是与foobarbaz相同的引用集。所以,你根本不能对它进行别名(因为没有必要,它永远不会被引用)。

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

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)

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

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

答案 1 :(得分:6)

我认为答案是 NO AS

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

Reference

更新

AS子句从version 9.5开始成为PostgreSQL的一部分,但正如上面提到的@MatBailie所述,嵌套意味着您需要为INSERT查询和{{1}设置别名单独的子查询或事情会破裂。 e.g:

SELECT

答案 2 :(得分:0)

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