是否可以为我将值插入的表指定别名?
我想在嵌套查询中指定一个条件,并且表格过于冗长......
有点像这样:
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);
(显然我的情况较长,并且涉及更多参考资料)
答案 0 :(得分:11)
您不对表进行别名,而是为表引用的实例添加别名。
这允许自连接等,因为您具有对同一物理表的引用的多个实例。这不是每个AS
在其他地方为该表提供新名称的情况,它只是引用该特定引用的别名。
在你的情况下,有两个show stoppers ......
正在插入的表本身不是选择查询的一部分,它不是与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)
但是这仍然让我们回到第一点,插入的表永远不会在语句的查询部分被引用。
我能想到的唯一方法就是创建一个视图......
答案 1 :(得分:6)
我认为答案是 NO 。 AS
tableName
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
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);