Псевдоним для имени таблицы в операторе вставки SQL - PullRequest
12 голосов
/ 01 февраля 2012

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

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

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

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 ]

11 голосов
/ 01 февраля 2012

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

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

В вашем случае есть два ограничителя show ...

Вставляемая таблица сама по себе не является частью запроса select, она не является набором ссылок так же, как 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)

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

Единственный способ приблизиться - создать представление ...

6 голосов
/ 01 февраля 2012

Я думаю, что ответ НЕТ .Нет 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)
0 голосов
/ 21 марта 2016

Как уже говорили другие, вы не можете использовать псевдоним имени как часть оператора 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);
...