sql - 查询以将相同的 ID 分配给插入的行,如果它已存在于表中

标签 sql oracle plsql

我将客户记录插入到表中,如果已存在同名记录,我会为新插入的记录分配相同的 ID。

假设表 T 有以下记录:

ID | Name | Phone_Number | Date_Inserted
105| Sam  | 111111       | 04/03/2014
106| Rita | 222222       |04/03/2014

我从表 A 插入这个:
Name| Phone_Number
Sam | 333333

然后插入后,表 T 应该有:
ID | Name | Phone_Number | Date_Inserted
105| Sam  | 111111       | 04/03/2014
106| Rita | 222222       | 04/03/2014
105| Sam  | 333333       | 04/04/2014

如果没有上述更改,它将看起来像:
INSERT INTO T SELECT CustID.nextval,Name,Phone_Number,SYSDATE FROM A;

本来想用的
INSERT INTO T
  SELECT CASE 
           WHEN NOT EXISTS(select null from T WHERE T.Name=A.Name) THEN CustID.nextVal
           ELSE (select ID from T where T.Name=A.Name) 
         END, 
         Name,
         Phone_Number,
         SYSDATE 
   FROM A;

但我不确定它是否会起作用,而且它似乎对性能来说是多余的/不利的。如果有更好的方法来做到这一点,请告诉我。

最佳答案

如果您的架构不是一成不变的,我可能会重新配置它,以便有一个“人员”表和一个单独的“人员电话号码”表。通过这种设置,您可以将多个电话号码与一个人相关联,并且您不会踩踏 ID,或创建不是主键的令人困惑的辅助 ID 列。

关于sql - 查询以将相同的 ID 分配给插入的行,如果它已存在于表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065372/

相关文章:

php - 四年前的MySQL查询

php - 如何连接3个数据不同的表?

sql - 如何在 Oracle SQL 中选择子字符串

oracle - 在 MS Access 中以编程方式创建 ODBC 连接和链接表

oracle - 在匿名 block 内显示选择结果

oracle - 当 END 后使用 SET SCAN ON 时会引发错误

SQL Server - 如何填充缺失的列值

sql - 如何更新 postgres 中时间戳字段的一部分?

java - JDBC Oracle 驱动程序存在包含特殊字符的用户名问题

sql - 使用另一个表中的值更新表