在Derby SQL中的INSERT中使用SELECT

时间:2014-12-02 12:00:15

标签: sql derby

我有以下SQL代码来创建和填充Derby中的几个表:

CREATE TABLE GROUPS (
    GRP_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,
    GRP_NAME VARCHAR(256) NOT NULL,
    DISPLAY_NAME VARCHAR(256));

CREATE TABLE USERS (
    USR_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,
    USR_NAME VARCHAR(256) NOT NULL,
    PASSWORD VARCHAR(512) NOT NULL,
    DISPLAY_NAME VARCHAR(256));

CREATE TABLE USR_GRP_MEMBERSHIP (
    USR_ID INTEGER NOT NULL REFERENCES USERS ON DELETE CASCADE,
    GRP_ID INTEGER NOT NULL REFERENCES GROUPS ON DELETE CASCADE,
    CONSTRAINT USR_ID_GRP_ID UNIQUE (USR_ID, GRP_ID));

INSERT INTO GROUPS(GRP_NAME, DISPLAY_NAME) VALUES('Users', 'Users');
INSERT INTO GROUPS(GRP_NAME, DISPLAY_NAME) VALUES('AdminUsers', 'Administrators');
INSERT INTO USERS(USR_NAME, PASSWORD, DISPLAY_NAME) VALUES('user', 'userpwd', 'User');
INSERT INTO USERS(USR_NAME, PASSWORD, DISPLAY_NAME) VALUES('admin', 'adminpawd', 'Administrator');

#The following code populates the USR_GRP_MEMBERSHIP table using the IDs of users
#& groups inserted in the previous set of insert statements

INSERT INTO USR_GRP_MEMBERSHIP VALUES((SELECT USR_ID FROM USERS WHERE USR_NAME = 'user'), (SELECT GRP_ID FROM GROUPS WHERE GRP_NAME = 'Users'));
INSERT INTO USR_GRP_MEMBERSHIP VALUES((SELECT USR_ID FROM USERS WHERE USR_NAME = 'admin'), (SELECT GRP_ID FROM GROUPS WHERE GRP_NAME = 'Users'));
INSERT INTO USR_GRP_MEMBERSHIP VALUES((SELECT USR_ID FROM USERS WHERE USR_NAME = 'admin'), (SELECT GRP_ID FROM GROUPS WHERE GRP_NAME = 'AdminUsers'));

我的问题是:最后3个INSERT语句中重复了SELECT个语句。如何将这些SELECT语句的输出存储在变量中并在这3个INSERT语句中使用它们?

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是在预准备语句中使用占位符?

这是一个很好的起点:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

您的陈述将类似于:

INSERT INTO USR_GRP_MEMBERSHIP 
VALUES ((SELECT USR_ID FROM USERS WHERE USR_NAME = ?), 
        (SELECT GRP_ID FROM GROUPS WHERE GRP_NAME = ?));

您可以使用'用户'用户'管理员' /'用户','替换占位符。管理员' /' AdminUsers'在运行时使用SetString(两次),然后使用ExecuteUpdate,每对。