我有两个表(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中的相同NAME的剩余记录:
TABLE2:
| ID_T2 | ID_T1 |
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
| 4 | 12 |
| 5 | 12 |
我试过这个:
UPDATE TABLE2
SET TABLE2.ID_T1 = (
SELECT TABLE1.ID_T1
FROM TABLE1
WHERE TABLE1.DATEBEGIN = '01/01/2017'
AND TABLE1.DATEEND IS NOT NULL
)
WHERE TABLE2.ID_T1 = (
SELECT TABLE1.ID_T1
FROM TABLE1
WHERE TABLE1.DATEBEGIN = '01/01/2017'
AND TABLE1.DATEEND IS NULL
);
但我不知道如何加入TABLE1.NAME并为TABLE2的所有行执行此操作 . 在此先感谢您的帮助 .
2 回答
首先创建一个临时表,找出要为哪个名称保留的id . 在多个可能值的情况下,我通过升序或id_t1选择了一个 .
创建下一个表以了解table2的哪个id连接到table1的哪个名称 .
由于这个新创建的表现在包含table1的id和name,以及table2的id,因此合并到它中以保留一对一的id1和table1的名称 .
现在最后我们有一个包含最终正确值的表,您可以将此故事重命名为table2,或者根据新表和原始table2的id合并原始table2 .
最后从table1中删除空值 .
您可以通过将
table1
加入到自身来加入name
列来完成此操作 . 使用第一个表(a)链接到table2.id_t1
和第二个表(b)以获取t1_id
,其中dateend
不为空 .这假设只有一个
table1
记录,其中dateend
不为空 .