Вставить с выбором, в зависимости от значений в таблице, вставляемой в EDITED

Поэтому мне нужно выяснить, как вставить в таблицу из другой таблицы с предложением where, которое требует от меня доступа к таблице, в которую я вставляю. Я попробовал псевдоним из таблицы, в которую я вставляю, но быстро обнаружил, что вы не можете этого сделать. По сути, я хочу проверить, соответствуют ли значения, которые я вставляю в таблицу, определенному полю в таблице, в которую я вставляю. Вот что я пробовал:

INSERT INTO "USER"."TABLE1" AS A1
SELECT * 
FROM "USER"."TABLE2" AS A2
WHERE A2."HIERARCHYLEVEL" = 2
AND A2."PARENT" = A1."INSTANCE"

Очевидно, это было ни к чему. Я пробовал пару других запросов, но они мне тоже нигде не помогли. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: я хотел бы добавить строки в эту таблицу, а не добавлять столбцы в таблицу. Две таблицы имеют одинаковую структуру — на самом деле я уже извлек данные из таблицы 1 из таблицы 2. В настоящее время у меня в таблице 1 есть куча записей, у которых НЕТ РОДИТЕЛЯ, но есть экземпляр. Я хочу добавить все записи, у которых есть родитель в таблице 2, равный экземпляру в таблице 1.


person Alexis Alias    schedule 21.06.2017    source источник
comment
Почему бы вам не использовать JOIN для поиска нужных вам строк?   -  person danielsepulvedab    schedule 21.06.2017
comment
Вам нужно иметь какую-то ссылку/соединение и ограничение на A1 в вашем подзапросе. Если подзапрос не работает сам по себе (как запрос верхнего уровня), сначала исправьте это.   -  person vwegert    schedule 21.06.2017
comment
@danielsepulvedab Пожалуйста, уточните... Я не уверен, что понимаю. Вы пытаетесь сказать, сделайте что-то вроде SELECT * FROM (TABLE1 INNER JOIN TABLE2 ON TABLE1.INSTANCE = TABLE2.PARENT)?   -  person Alexis Alias    schedule 21.06.2017
comment
@vwegert, я думаю, проблема, с которой я сталкиваюсь, для начала заключается в том, что я не могу использовать псевдоним для таблицы, в которую я вставляю - как я упоминал в ОП. Однако, если я удалю псевдоним и явно укажу схему и таблицу внутри оператора select, я получу еще одну ошибку.   -  person Alexis Alias    schedule 21.06.2017
comment
@AlexisAlias ​​Я не знаю отношений между таблицами, поэтому не могу дать полный ответ. Сначала вам нужно написать запрос, который возвращает строки, которые вы хотите вставить. Посмотрите на это: w3schools.com/sql/sql_join.asp   -  person danielsepulvedab    schedule 21.06.2017
comment
@danielsepulvedab, две таблицы абсолютно одинаковы по структуре. На самом деле данные, существующие в таблице 1, были снова извлечены из таблицы, из которой я пытаюсь извлечь. Я не пытаюсь присоединиться к таблицам и получить больше столбцов. Теперь я пытаюсь добавить больше строк в таблицу при условии, что таблица, из которой я извлекаю, имеет родительский столбец, равный столбцу экземпляра в таблице, в которую я вставляю. Например, если у меня есть запись в таблице один, экземпляр которой равен x, все записи из таблицы два, родительским элементом которой является x, должны быть добавлены в таблицу как ее собственная строка.   -  person Alexis Alias    schedule 21.06.2017
comment
Опять же - и, как также написал @danielsepulvedab: подзапрос должен быть функциональным сам по себе, а в форме, указанной вами выше, это не так. Вы не можете просто поместить произвольную таблицу в предложение WHERE и ожидать, что СУБД сама выяснит, что с ней делать.   -  person vwegert    schedule 22.06.2017
comment
@vwegert Мое решение сработало именно так, как я хотел. Более того, подзапрос, по сути, функционален сам по себе.   -  person Alexis Alias    schedule 22.06.2017


Ответы (2)


В настоящее время нет возможности присоединиться к таблице при вставке. Решение с подзапросом, где вы выбираете из таблицы, является правильным.

Псевдоним таблицы, которую вы хотите изменить, возможен только с помощью UPDATE, UPSERT и MERGE. Для этих операций это имеет смысл, так как вам нужно сопоставить столбец, а затем решить, нужно ли вам обновить его или вставить что-то вместо него. В вашем примере строка из table1, которую вы сопоставляете, не имеет значения, так как вы не хотите ее менять, поэтому с точки зрения оператора на самом деле не имеет значения, что таблица, которую вы используете в своем подзапросе, такая же, как и та вы вставляете в.

В качестве альтернативы я могу предложить вам следующее решение, эквивалентное вашему:

INSERT INTO "user"."table1"
SELECT 
   A1."ROOT",
   A1."INSTANCE",
   A1."PARENT",
   A1."HIERARCHYLEVEL"
FROM "user"."table2" AS A1
WHERE A1."INSTANCE" in (select "PARENT" from "user"."table1")
AND A2."HIERARCHYLEVEL" = 2
person polyglot_phil    schedule 22.06.2017

Это дало мне ответ, который я искал, хотя я уверен, что есть более простой или более эффективный способ сделать это.

INSERT INTO "user"."table1" 
SELECT 
   A1."ROOT",
   A1."INSTANCE",
   A1."PARENT",
   A1."HIERARCHYLEVEL"
FROM "user"."table2" AS A1,
     "user"."table1" AS A2
WHERE A1."INSTANCE" = A2."PARENT"
AND A2."HIERARCHYLEVEL" = 2
person Alexis Alias    schedule 21.06.2017