【发布时间】:2017-07-24 10:31:36
【问题描述】:
我有两个表(ORACLE11):
TABLE1: (ID_T1 is TABLE1 primary key)
| ID_T1 | NAME | DATEBEGIN | DATEEND |
| 10 | test | 01/01/2017 | 01/06/2017 |
| 11 | test | 01/01/2017 | null |
| 12 | test1 | 01/01/2017 | 01/06/2017 |
| 13 | test1 | 01/01/2017 | null |
TABLE2: (ID_T2 is TABLE2 primary key and ID_T1 is TABLE2 foreign key on TABLE1)
| ID_T2 | ID_T1 |
| 1 | 10 |
| 2 | 11 |
| 3 | 11 |
| 4 | 12 |
| 5 | 13 |
我需要从 TABLE1 中删除所有行,其中 TABLE1.DATEEND = 'null'
但首先我必须更新 TABLE2 以将 TABLE2.ID_T1 修改为 TABLE1 中相同名称的剩余记录:
TABLE2:
| ID_T2 | ID_T1 |
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
| 4 | 12 |
| 5 | 12 |
我试过了:
更新表2 设置表 2.ID_T1 = ( 选择表 1.ID_T1 从表 1 其中 TABLE1.DATEBEGIN = '01/01/2017' 并且 TABLE1.DATEEND 不为空 ) 表 2.ID_T1 = ( 选择表 1.ID_T1 从表 1 其中 TABLE1.DATEBEGIN = '01/01/2017' 并且 TABLE1.DATEEND 为 NULL ); 但我不知道如何加入 TABLE1.NAME 并为 TABLE2 的所有行执行此操作。在此先感谢您的帮助。【问题讨论】:
-
那么重新分配
TABLE2.ID_T1的规则是什么?TABLE1.ID_T1的最高值是否低于TABLE2.ID_T1的当前值,其中TABLE1.DATEEND不为空? -
或者您是否保证
TABLE1在NAME中始终只有一条记录,其中DATEEND不为空? -
是的,我忘了提到每个 NAME 只有一条记录,其中 DATEEND 不为空
-
Oracle(在许多情况下)是一个多用户环境。您可能必须在操作期间锁定两个表。想象一下:您更新了表 2 中的 ID,其他人为表 1 中的名称添加了一个新行,并将该名称最近一行的日期更改为 NULL。然后您删除表 1 中所有日期为 NULL 的行 - 包括您认为不会被删除的行。现在您失去了表之间的连接。所以你必须确保这不会发生。
标签: oracle sql-update