Псевдоним для имени таблицы в инструкции SQL insert

можно ли указать псевдоним для таблицы, в которую я вставляю значения?

Я хочу указать условие внутри вложенного запроса, и таблица слишком многословна...

что-то вроде превращения этого:

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 ответов


вы не псевдоним таблицы, вы псевдоним экземпляра ссылки на таблицу.

это позволяет самостоятельно присоединяться и т. д., Поскольку у вас есть экземпляры mutliple ссылок на ту же физическую таблицу. Это не тот случай, когда каждый AS дает этой таблице новое имя в другом месте, это просто псевдоним для ссылки на эту конкретную ссылку.


в вашем случае, есть два шоу-стопперы...

вставляемая таблица сама по себе не является частью select запрос, это не ссылочный набор так же, как foo, bar или baz например. Таким образом, вы не можете использовать псевдоним вообще (потому что нет необходимости, на него никогда нельзя ссылаться).

кроме того, даже если он был, вы не можете ссылаться на всю таблицу через псевдоним. Вы ссылаетесь на поле, как часть запроса itterating через набор. Например, это тоже не работает...

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