Я хочу создать скрипт вставки для таблицы sd_roles. Некоторые строки должны иметь значения идентификатора другой строки.
Таблица sd_roles создается с помощью этого скрипта:
-- Table: sd_roles
-- DROP TABLE sd_roles;
CREATE TABLE sd_roles
(
id integer NOT NULL DEFAULT nextval('roles_serials'::regclass),
masterid integer,
rname character varying(150) NOT NULL,
CONSTRAINT sd_roles_pkey PRIMARY KEY (id),
CONSTRAINT rname_unique UNIQUE (rname)
)
WITH (
OIDS=FALSE
);
ALTER TABLE sd_roles
OWNER TO postgres;
GRANT ALL ON TABLE sd_roles TO postgres;
GRANT ALL ON TABLE sd_roles TO eomeroff;
-- Trigger: lowecase_roles_on_insert_trigger on sd_roles
-- DROP TRIGGER lowecase_roles_on_insert_trigger ON sd_roles;
CREATE TRIGGER lowecase_roles_on_insert_trigger
BEFORE INSERT OR UPDATE
ON sd_roles
FOR EACH ROW
EXECUTE PROCEDURE lowecase_roles_on_insert();
У меня есть такой код:
DELETE FROM sd_roles;
WITH appconfiguration AS (
INSERT INTO sd_roles
(masterid, rname)
VALUES
(null, 'Appconfiguration')
RETURNING id
)
INSERT INTO sd_roles (masterid, rname)
VALUES ((SELECT id FROM appconfiguration), 'GroupsandRolesConfig');
Теперь мне нужно добавить код для вставки другой строки, в которой будет поле masterid, равное идентификатору строки, значение rname которой равно GroupandRolesConfig. Точно так же, как строка, где поле «rname» равнозначно «GroupsandRolesConfig», имеет значение «masterid», которое является идентификатором строки, поле «rname» которой эквивалентно «Appconfiguration».
Моя проблема в том, что предложение вставки, которое следует за cluase, не может запомнить идентификатор вставленного значения, поэтому я мог бы его повторно использовать.
Как это сделать?
2 ответа
У вас может быть более одного CTE, вы можете связать их столько, сколько вам нужно.
WITH appconfiguration AS (
INSERT INTO sd_roles
(masterid, rname)
VALUES
(null, 'Appconfiguration')
RETURNING id
), groups AS (
INSERT INTO sd_roles (masterid, rname)
VALUES ((SELECT id FROM appconfiguration), 'GroupsandRolesConfig')
RETURNING id
)
INSERT INTO sd_roles (masterid, rname)
VALUES ((SELECT id FROM groups), 'foobar');
http://sqlfiddle.com/#!15/3cebb/3
Этот код работает:
DELETE FROM sd_roles;
INSERT INTO sd_roles (masterid, rname)
VALUES (null, 'Superadmin');
WITH appconfiguration AS (
INSERT INTO sd_roles
(masterid, rname)
VALUES
(null, 'Appconfiguration')
RETURNING id
)
INSERT INTO sd_roles (masterid, rname)
VALUES ((SELECT id FROM appconfiguration), 'Database'),
((SELECT id FROM appconfiguration), 'GroupsandRolesConfig');
WITH groupsandRolesConfig AS (
SELECT * FROM sd_roles where rname = LOWER('GroupsandRolesConfig')
)
INSERT INTO sd_roles (masterid, rname)
VALUES ((SELECT id FROM groupsandRolesConfig), 'AddDeleteGroups'),
((SELECT id FROM groupsandRolesConfig), 'AssignRolesToGroups');
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.