将语句合并到表中会创建重复项吗?

问题描述 投票:0回答:1

我有一个此处指定的教育表,它引用了程序和用户表。

这两个表的重要部分就是键program_id和user_id。

CREATE TABLE Education(
    user_id INTEGER NOT NULL,
    program_id INTEGER NOT NULL,
    FOREIGN KEY (program_id) REFERENCES Programs,
    PRIMARY KEY (user_id),
    FOREIGN KEY(user_id) REFERENCES Users,
    program_year INTEGER NOT NULL
);

我尝试将另一个表合并到这个表中,如下所示:

MERGE INTO Education e
    USING (SELECT u.user_id, p.program_id, u.program_year
           FROM project1.Public_User_Information u,
                Programs p
           WHERE p.institution = u.institution_name
             AND p.concentration = u.program_concentration
             AND p.degree = u.program_degree
    ) d
    ON (e.user_id = d.user_id)
    WHEN NOT MATCHED THEN
        INSERT (user_id, program_id, program_year)
        VALUES (d.user_id, d.program_id, d.program_year);

WHERE 语句的想法是从 Programs 中获取与相应机构名称、浓度和项目学位相匹配的 program_id。

然后,我检查重复的键 user_id,如果不匹配,则插入一个新条目。

但是,我不断收到错误,表明此合并违反了唯一约束。

我做错了什么吗? 非常感谢!

sql oracle merge duplicates sqlplus
1个回答
0
投票

确保您的

SELECT
语句不会为每个
user_id
返回多行。

例如:

CREATE TABLE programs (
  program_id    INTEGER PRIMARY KEY,
  institution   VARCHAR2(20),
  concentration VARCHAR2(20),
  degree        VARCHAR2(20)
);

CREATE TABLE users (
  user_id               INTEGER PRIMARY KEY
);

CREATE TABLE /*project1.*/Public_User_Information (
  user_id               INTEGER,
  program_year          INTEGER,
  institution_name      VARCHAR2(20),
  program_concentration VARCHAR2(20),
  program_degree        VARCHAR2(20)
);

CREATE TABLE Education(
    user_id INTEGER NOT NULL,
    program_id INTEGER NOT NULL,
    FOREIGN KEY (program_id) REFERENCES Programs,
    PRIMARY KEY (user_id),
    FOREIGN KEY(user_id) REFERENCES Users,
    program_year INTEGER NOT NULL
);

INSERT ALL
  INTO programs (program_id, institution, concentration, degree)
    VALUES (1, 'A', 'B', 'C')
  INTO users (user_id) VALUES (1)
  INTO /*project1.*/Public_User_Information (user_id, program_year, institution_name, program_concentration, program_degree)
    VALUES (1, 1970, 'A', 'B', 'C')
  INTO /*project1.*/Public_User_Information (user_id, program_year, institution_name, program_concentration, program_degree)
    VALUES (1, 1971, 'A', 'B', 'C')
SELECT * FROM DUAL;

然后:

MERGE INTO Education e
    USING (SELECT u.user_id, p.program_id, u.program_year
           FROM /*project1.*/Public_User_Information u,
                Programs p
           WHERE p.institution = u.institution_name
             AND p.concentration = u.program_concentration
             AND p.degree = u.program_degree
    ) d
    ON (e.user_id = d.user_id)
    WHEN NOT MATCHED THEN
        INSERT (user_id, program_id, program_year)
        VALUES (d.user_id, d.program_id, d.program_year);

输出:

ORA-00001: unique constraint (FIDDLE_MPWPWTLRQFOVUMVRIBPO.SYS_C00104416) violated

如:

SELECT u.user_id, p.program_id, u.program_year
FROM   /*project1.*/Public_User_Information u,
       Programs p
WHERE  p.institution   = u.institution_name
AND    p.concentration = u.program_concentration
AND    p.degree        = u.program_degree

同一行输出多行

user_id
:

用户ID 程序_ID PROGRAM_YEAR
1 1 1970
1 1 1971

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.