【问题标题】:Oracle 11g Insert into from another table that has duplicatesOracle 11g 从另一个有重复的表插入
【发布时间】:2023-03-09 22:05:02
【问题描述】:

好的,我有 2 个新表:Client 和 Contract。我将专注于第一个,因为它们具有相同的结构。客户端看起来像:

+-----------+---------+
| client_id |  name   |
+-----------+---------+
| Value 1   | Value 2 |
+-----------+---------+

并像这样创建:

CREATE TABLE Client (
  client_id varchar2(15)  NOT NULL,
  name varchar2(100)  NOT NULL,
  CONSTRAINT Client_pk PRIMARY KEY (client_id)
) ;

我还有一张旧表:old_contracts 看起来像:

+------------+----------+------+
| contractid | clientid | name |
+------------+----------+------+
| con1       | cli1     | n1   |
| con2       | cli2     | n2   |
| con3       | cli2     | n2   |
| con4       | cli3     | n3   |
| con5       | cli3     | n3   |
+------------+----------+------+

定义:

CREATE TABLE old_contracts(
  contractid varchar2(15)  NOT NULL
  clientid varchar2(15)  NOT NULL,
  name varchar2(100)  NOT NULL
) ;

我想从 old_contract 中获取数据并将其插入到客户端中。


这个 old_contracts 表有重复的 clientid 行(一个客户可以有多个合同),但我不想在 Client 表上有重复,所以我这样做:

INSERT INTO Client (
  client_id,
  name
) SELECT DISTINCT
  clientid,
  name
FROM old_contracts;

不重复。无论如何,我收到了这个错误:

错误 SQL:ORA-00001:违反唯一约束 (USER.CLIENT_PK)

00001.00000 - “违反了唯一约束 (%s.%s)”

发生了什么事?我相信 DISTINCT 关键字会起作用。


我也尝试按照相关帖子中的建议添加 WHERE NOT EXISTS 子句(即this one),但我得到的结果是相同的错误。

【问题讨论】:

    标签: database oracle oracle11g insert duplicates


    【解决方案1】:

    很可能,给定 clientid 的名称并不总是相同。

    试试这个:

    INSERT INTO Client (
     client_id,
      name
    ) SELECT clientid,
      max(name)
    FROM old_contracts
    GROUP BY clientid;
    

    【讨论】:

    • 这让我可以插入数据,但现在我遇到了另一个问题:当我尝试对合同表做同样的事情时(其中有字段 Client 作为外键 (contract_client_fk) 来引用client.client_id) 我得到“ORA-02291: 违反完整性约束 (user.contract_client_fk) - 未找到父密钥”
    • 必须说Contract表中的client列可以为空。
    • Nullable 在这里不是问题...但是由于您已经使用 client_ids 中存在的所有 client_ids 填充了 Client old_contracts,所以当您用old_contracts 填充Contract。也许是一个小错误让您尝试将contract_id 插入client_id 列或类似的东西?
    • 好吧,忘了我说的话。这个问题与错字有关。谢谢大家。
    • @KevinRomero - 这是解决业务问题的正确解决方案吗?我同意 ammoQ 的观点,最初的问题很可能是由多个 name 与同一个 clientid 关联引起的,至少有一个 clientid。在这种情况下,此处提供的解决方案实质上是“选择与旧表中的clientid 关联的任何名称并将其用于新表;忽略相同clientid 的所有其他名称”。还有其他选择,例如使用最长的名称,或最短的名称,或与最近的合同相关的名称等。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2015-08-31
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多