Postgresql подзапрос выборки нескольких строк - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть таблица (table2) с 2 столбцами: имя и возраст.У меня есть другая таблица (table1) с именем столбца, возрастом, значением, типом.

Я хочу обновить table1 с добавлением значений table2 и для значения = 1 и type = "abc".

Я попытался:

Метод 1:

insert into table1(select * from table2), 1, 'abc';

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

Метод 2:

CREATE TABLE table2
(
   name varchar(20),
   age varchar(20)
);

insert into table2 .... inserted some values

alter table table2 add "value" varchar(10);
alter table table2 add "name" varchar(20);

update table2 set value=1, name='abc';
insert into table1 select * from table2;

Я использую PostgreSQL.Может ли кто-нибудь помочь мне, как решить проблему.Метод 2 работает, но это не самый эффективный способ, я думаю.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011
INSERT INTO table1
SELECT table2.*, 1, 'abc'
FROM table2;

Запись * является ярлыком для всех столбцов ссылочных таблиц, но вы все равно можете добавить дополнительные столбцы, например, константы, если хотите.

0 голосов
/ 20 апреля 2011

Для метода 1: поскольку подзапрос возвращает несколько значений для одной вставки, появляется ошибка.

Метод 2:

Этот метод работает, потому что вы создаете таблицу 2, аналогичную таблице 1, а затем вставляете все значения из таблицы 2 в таблицу 1.Если вы делаете это, то почему вы должны поддерживать две отдельные таблицы для хранения одинаковых данных?

Вы можете использовать курсор для решения этой проблемы.

CREATE PROCEDURE USER_DATA_CURSOR
AS
DECLARE MY_CURSOR 
FOR
Select name,age From table2

Open My_Cursor

DECLARE @name varchar(20), @age varchar(20)

Fetch NEXT FROM MY_Cursor INTO @name, @age
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)

insert into table1(name,age,type,value) values(@name,@age,'abc',1);


FETCH NEXT FROM MY_CURSOR INTO @name, @age 
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

Exec USER_DATA_CURSOR

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...